알고리즘

[백준, 파이썬, 4583번] 거울상

hminor 2024. 2. 14. 10:43

풀이

  • 뭔가 뭔가하게 깔끔하지 못한 풀이가 되어버린...
  • 작성 초기엔 간단하게 작성 가능할거라고 생각했는데 숨겨진 TC를 찾다보니 더러워져버렸다.
  • 우선 그냥 빈 문자열에 값을 추가하면서 진행하게 되면
  • 객체를 계속 생성하는 비효율적인 문제로 result를 문자 크기에 맞게 생성 후 작업
  • 이후 반목문을 통한 i와 back의 값이 서로 거울상 관계인지, 자신과 거울상인지 확인 후
  • dic에 key값으로 값을 넣어 저장
  • 이후 문자열 길이가 홀수의 경우 따로 한 번 더 조건을 추가하여 해결

 

import sys
input = sys.stdin.readline

mirror = {"b","d","p","q","i","o","v","w","x"}
dic = {"b":"d",
        "d":"b",
        "p":"q",
        "q":"p"
        }
 
while True:
    text = input().rstrip('\n')
    if text == "#": break
 
    t_ln = len(text)
    result = [""]*t_ln
    state = True
 
    for i in range(t_ln//2):
        back = t_ln-1-i
        if (text[i],text[back]) == ("b","d") or (text[i],text[back]) == ("p","q") : result[i],result[back] = text[i],text[back]
        elif text[i] in mirror and text[back] in mirror:
            if text[i] in {"b","d","p","q"} and text[back] in {"b","d","p","q"}: result[i],result[back] = dic[text[back]],dic[text[i]]
            elif text[i] in {"b","d","p","q"}: result[i],result[back] = text[back],dic[text[i]]
            elif text[back] in {"b","d","p","q"}:result[i],result[back] = dic[text[back]],text[i]
            else: result[i],result[back] = text[back],text[i]
        else:
            state = False
            break
   
    if state:
        if t_ln%2:
            if text[t_ln//2] not in mirror: print("INVALID")
            else:
                if text[t_ln//2] in {"b","d","p","q"}: result[t_ln//2] = dic[text[t_ln//2]]
                else: result[t_ln//2] = text[t_ln//2]
                print("".join(result))
        else:
            print("".join(result))
    else: print("INVALID")