문제 링크
문제 요약
주어진 문자열이 ‘모스 부호 팰린드롬’인지 판별하는 문제입니다. 모스 부호 팰린드롬은 다음과 같은 과정을 통해 판별합니다.
- 입력 문자열에서 영문자와 숫자만을 추출합니다.
- 추출된 모든 문자를 대문자로 변환합니다. (대소문자 구별 없음)
- 각 문자를 해당 모스 부호로 변환합니다.
- 변환된 모든 모스 부호를 공백 없이 하나의 긴 문자열로 연결합니다.
- 최종적으로 연결된 모스 부호 문자열이 앞뒤가 같은 팰린드롬인지 확인합니다.
만약 입력 문자열에 영문자나 숫자가 전혀 없어 최종 모스 부호 문자열이 비어있다면, NO
를 출력해야 합니다.
풀이
이 문제는 주어진 규칙에 따라 입력 문자열을 변환한 후, 팰린드롬 여부를 판별하는 전형적인 문자열 처리 문제입니다.
- 모스 부호 매핑: 문제에서 주어진 영문자와 숫자에 대한 모스 부호 정보를 파이썬 딕셔너리 형태로 미리 저장합니다.
- 입력 문자열 처리:
- 먼저 입력 문자열을 한 줄로 읽어옵니다.
- 대소문자를 구분하지 않으므로, 입력받은 문자열 전체를
upper()
함수를 사용하여 대문자로 변환합니다. - 변환된 문자열의 각 문자를 순회하면서,
morse_code
딕셔너리에 해당 문자가 키로 존재하는지 확인합니다. - 만약 문자가 딕셔너리에 존재한다면 (즉, 영문자 또는 숫자라면), 해당 모스 부호를 리스트에 추가합니다.
- 문자가 딕셔너리에 존재하지 않는다면 (즉, 공백, 구두점 등 비알파벳/숫자 문자라면), 해당 문자는 무시하고 리스트에 추가하지 않습니다.
- 모스 부호 연결: 개별 문자들이 변환되어 리스트에 저장된 모스 부호 문자열들을
"".join()
함수를 사용하여 하나의 긴 문자열로 합칩니다. 이 과정에서 각 모스 부호 사이에 공백이 들어가지 않도록 유의합니다. - 팰린드롬 판별 및 예외 처리:
- 최종적으로 연결된 모스 부호 문자열이 비어있는지 확인합니다. 만약 비어있다면, 입력 문자열에 유효한 영문자나 숫자가 없었다는 의미이므로 문제의 조건에 따라
NO
를 출력합니다. - 문자열이 비어있지 않다면, 해당 문자열이 팰린드롬인지 확인합니다. 파이썬에서는 문자열 슬라이싱
[::-1]
을 이용하여 문자열을 뒤집을 수 있습니다. 원본 모스 부호 문자열과 뒤집은 모스 부호 문자열이 동일한지 비교하여, 같으면YES
, 다르면NO
를 출력합니다.
- 최종적으로 연결된 모스 부호 문자열이 비어있는지 확인합니다. 만약 비어있다면, 입력 문자열에 유효한 영문자나 숫자가 없었다는 의미이므로 문제의 조건에 따라
정답 코드
"""
[24745: Morse Code Palindromes](https://www.acmicpc.net/problem/24745)
Tier: Bronze 1
Category: implementation, precomputation, string
"""
import sys
from math import sqrt, pi, sin, factorial, ceil, floor
from datetime import datetime, timedelta
from collections import deque, defaultdict, Counter
from itertools import permutations, combinations, product
from bisect import bisect_left, bisect_right
from heapq import heappush, heappop, heapify
from functools import reduce, lru_cache
from operator import itemgetter, attrgetter, mul, add, sub, truediv
from typing import List, Tuple, Dict, Set, Any, Union
SYS_INPUT = True
RECURSION_LIMIT = 10 ** 7
SET_RECURSION = False
BLANK = " "
if SET_RECURSION:
sys.setrecursionlimit(RECURSION_LIMIT)
inp = lambda : sys.stdin.readline().rstrip() if SYS_INPUT else input()
mii = lambda : [*map(int,inp().split())]
mfi = lambda : [*map(float,inp().split())]
ii = lambda : int(inp())
fi = lambda : float(inp())
isplit = lambda : inp().split()
p = print
def gcd(a, b): return gcd(b, a % b) if b > 0 else a
def lcm(a, b): return a * b // gcd(a, b)
morse_code = {"A":".-", "B":"-...", "C":"-.-.", "D":"-..", "E":".",
"F":"..-.", "G":"--.", "H":"....", "I":"..", "J":".---",
"K":"-.-", "L":".-..", "M":"--", "N":"-.", "O":"---",
"P":".--.", "Q":"--.-", "R":".-.", "S":"...", "T":"-",
"U":"..-", "V":"...-", "W":".--", "X":"-..-", "Y":"-.--",
"Z":"--..", "0":"-----", "1":".----", "2":"..---", "3":"...--",
"4":"....-", "5":".....", "6":"-....", "7":"--...", "8":"---..",
"9":"----."}
def solve():
morse = [morse_code[i] if i in morse_code else "" for i in input().upper()]
morse = "".join(morse)
if not morse:
return "NO"
if morse == morse[::-1]:
return "YES"
else:
return "NO"
if __name__ == "__main__":
tc = 1
for t in range(1, tc+1):
ret = solve()
print(ret)