본문 바로가기
ALGORITHM/백준

[BOJ/PYTHON] 4583. 거울상

by 뭉망뭉 2023. 6. 1.

백준 문제 링크: https://www.acmicpc.net/problem/4583

문제 요약

거울상 관계인 글자는 글자를 거울로 비추었을 때 거울에 반사되기 전 모습을 유추 가능

서로 거울상: b, d / p, q 자신과 거울상: i, o, v, w, x

거울상이 있으면 거울상 모습 출력, 없으면 INVALID를 출력.

핵심 아이디어

자신과 거울상인 경우의 self_mirror_list 리스트, 짝을 이뤄 거울상인 pair_mirror_list 리스트를 만들어줬다.

거울에 비춰지기 전 모습을 구해야 하는데, b가 오면 d를, d가 오면 b를, p가 오면 q를, q가 오면 p를 넣어주면 된다. 이것을 위해 pair_mirror_list에 각자의 거울상이 본인 바로 다음에 오게 배치해놨다. b 다음에 d, d 다음에 b, p 다음에 q, q 다음에 p를 넣어놨기 때문에 pair_mirror_list.index(alphabet) + 1를 하면 찾은 값의 바로 다음 인덱스인 거울상 알파벳을 찾을 수 있다.

pair_mirror_list.index(alphabet)으로 원하는 알파벳을 리스트에서 찾으면 index()의 로직 상 가장 먼저 찾은, 가장 앞에 있는 인덱스가 나온다. 그래서 리스트에서 p는 맨 끝에도 존재하지만 앞에 있는 p의 인덱스인 3이 찾아지기 때문에 저 방식이 가능하다.

단어를 뒤집어놓고 하나하나 보면서 알파벳이 self_mirror_list에 있으면 그 알파벳 그대로 넣어주고, pair_mirror_list에 있으면 다음 인덱스의 알파벳(거울상에 해당하는 알파벳)을 넣어주면 된다. 아닌 경우는 INVALID를 출력하면 된다.

풀이

# bronze2-4583. 거울상

import sys
input = sys.stdin.readline

self_mirror_list = ["i", "o", "v", "w", "x"]
# 각자의 거울상이 바로 다음에 오게 배치함. 
# pair_mirror_list.index(alphabet)로 찾는 경우 앞부터 찾기 때문에 
# b의 경우 제일 앞에 있는 0번 인덱스가 선택돼
# pair_mirror_list.index(alphabet) + 1은 1번 인덱스인 d가 됨.  
pair_mirror_list = ["b", "d", "b", "p", "q", "p"] 

while True:
    word = input().rstrip()
    if word == "#": break

    mirror_word = []
    for alphabet in word[::-1]: # 거울상이니까 뒤에서부터 확인
        if alphabet in self_mirror_list: 
            mirror_word.append(alphabet)
        elif alphabet in pair_mirror_list: 
            # 각자의 거울상 추가하게 함.
            mirror_word.append(pair_mirror_list[pair_mirror_list.index(alphabet) + 1])
        else: 
            print("INVALID")
            mirror_word = [] # 불가능한 문자 만나기 전에 리스트에 append된 경우 커버용으로 비워줌
            break
    if mirror_word: # 빈 배열 오는 경우 따로 출력하지 않기 위함
        print(*mirror_word, sep='')

실행 시간

메모리 31256KB, 시간 36ms (python3)

댓글