백준 문제 링크: 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)
'ALGORITHM > 백준' 카테고리의 다른 글
[BOJ/PYTHON] 6996. 애너그램 (0) | 2023.07.27 |
---|---|
[BOJ/PYTHON] 11003. 최솟값 찾기 (0) | 2023.06.15 |
[BOJ/PYTHON] 5052. 전화번호 목록 (0) | 2023.06.01 |
[BOJ/PYTHON] 14425. 문자열 집합 (0) | 2023.06.01 |
[BOJ/PYTHON] 15904. UCPC는 무엇의 약자일까? (0) | 2023.06.01 |
댓글