정상적인 팰린드롬은 숫자 또는 문자의 문자열로, 앞에서부터 뒤로 읽어도 뒤에서부터 앞으로 읽어도 동일한 문자열입니다.
예를 들어, "ABCDEDCBA" 문자열은 팰린드롬입니다.
왜냐하면 이 문자열은 왼쪽에서 오른쪽으로 읽을 때와 오른쪽에서 왼쪽으로 읽을 때 모두 동일합니다.
거울 모양 문자열은 문자열의 각 요소가 그 역(reverse)으로 바뀌었을 때 (만약 역이 있는 경우) 문자열을 뒤에서부터 읽을 때 결과가 원래 문자열과 동일한 문자열입니다.
예를 들어, "3AIAE" 문자열은 거울 모양 문자열입니다. 왜냐하면 "A"와 "I"는 자신의 역(reverse)이며, "3"과 "E"는 서로의 역(reverse)입니다.
거울 팰린드롬은 정상적인 팰린드롬의 조건과 거울 모양 문자열의 조건을 모두 충족하는 문자열입니다.
"ATOYOTA" 문자열은 거울 팰린드롬입니다. 왜냐하면 이 문자열을 뒤에서부터 읽으면 원본과 동일하며, 각 문자가 그 역으로 대체되고 결과를 뒤에서부터 읽으면 원래 문자열과 동일하기 때문입니다.
물론 "A", "T", "O", "Y"는 모두 자신의 역(reverse)입니다.
거울 문자열을 만족하는 문자와 그들의 역(reverse)은 다음과 같습니다.
※ 0 (영)과 O (알파벳)은 동일한 문자로 간주되므로 유효한 문자는 오직 "O" (알파벳 O)만 해당됩니다.
입력은 한 줄에 하나의 문자열로 구성되며, 각 문자열은 하나에서 스무 개의 유효한 문자로 이루어집니다.
그 어떠한 문자열에도 유효하지 않은 문자가 포함되지 않습니다.
프로그램은 파일의 끝까지 읽어야 합니다.
각 입력 문자열에 대해, 문자열은 1열에서 시작하여 정확히 다음 중 하나의 문자열을 즉시 출력해야 합니다.
문자열 -- is not a palindrome.
문자열 -- is a palindrome.
문자열 -- is a mirrored string.
문자열 -- is a mirrored palindrome.
로직 자체는 간단한 편이지만, 출력으로 인해 많은 틀렸습니다
를 띄운 문제.
로직은 아래와 같이 짰다.
먼저, 팰린드롬을 확인하는 bool 변수와 mirror인지 여부를 확인하는 bool 변수를 두 개를 만든다.
그 다음 팰린드롬 확인하는 변수는 그냥 역순으로 뒤집은 문자열과 해당 문자열이 같은지 확인해준다.
그 후, 미러 문자가 담긴 딕셔너리를 만들고 비교할 문자열의 문자를 하나씩 돌며 미러 문자 딕셔너리 안에 해당 문자가 있는지 확인해준다.
없는 경우에는 mirror 여부를 확인하는 bool변수를 false로 만든 다음 for문을 나온다.
그 후 그 변수들이 모두 true면 미러 팰린드롬, 하나만 만족하면 미러 문자열이나 팰린드롬, 둘 다 아니면 그냥 팰린드롬이 아니라는 문장을 출력한다.
사실 로직은 듣고 보면 쉬운 편이나, 문제는 위에서 말했듯이 출력!
수 많은 출력 오류를 띄웠는데... 여기서 유의할 점은.
문제 보면 파일의 끝을 보고 처리하라고 했다. = EOF Error.
Try - exception 쓰되, EOF Error로 처리해야 출력 초과 오류가 안 뜬다.
줄 바꿈.
한 줄씩 출력할 때마다 문장과 문장 사이에 공백인 줄이 있다..
그걸 몰라서 출력 형식이 잘못 되었습니다.
오류를 띄웠....
이건 줄 바꿈 문자 넣어주면 해결~
import sys
mirror = {'A': 'A', 'M':'M', 'Y':'Y', 'Z':'5', 'O':'O', '1':'1', '2':'S', 'E':'3', '3':'E', 'S':'2', '5':'Z', 'H':'H', 'T':'T', 'I': 'I', 'U':'U', 'J':'L', 'V':'V', '8':'8', 'W':'W', 'L':'J', 'X':'X'}
while True:
try:
s = sys.stdin.readline().rstrip()
if not s:
break
m_check = False
p_check = False
if s[::-1] != s:
p_check = False
for c in s:
if c in mirror:
m_check = True
else:
m_check = False
break
else:
p_check = True
for c in s:
if c in mirror:
m_check = True
else:
m_check = False
break
if m_check and p_check:
print('%s -- is a mirrored palindrome.\n' % s)
elif m_check and not p_check:
print('%s -- is a mirrored string.\n' % s)
elif not m_check and p_check:
print('%s -- is a palindrome.\n' % s)
elif not m_check and not p_check:
print('%s -- is not a palindrome.\n' % s)
except EOFError:
break