오늘은 파이썬에서 문자열이 회문인지 판별하는 방법에 대해 배웠습니다.
회문(palindorme):거꾸로 읽은것과 제대로 읽은 것이 같은 말.
예) 토마토, refer, 기러기, SOS
회문의 경우 첫 번째 글자와 마지막 글자가 같고 안쪽으로 한 글자씩 좁혀질 때 글자가 같습니다.
'refer' 의 경우 f 를 기준으로 하여 좌우의 문자가 같습니다.
그렇다면 문자가 같은지 여부를 판단하기 위해 어떻게 해야할까요?
word = input('단어를 입력하세요: ') is_palindrome = True # 회문 판별값을 저장할 변수, 초깃값은 True for i in range(len(word) // 2): # 0부터 문자열 길이의 절반만큼 반복 if word[i] != word[-1 - i]: # 왼쪽 문자와 오른쪽 문자를 비교하여 문자가 다르면 is_palindrome = False # 회문이 아님 break print(is_palindrome) # 회문 판별값 출력
회문 판별에서 가장 중요한 부분은 length(길이) 입니다.
예를 들어 문자열의 길이가 5이라면 5//2 =2 이므로 가운데 글자(3번째 글자) 바로 앞까지만 검사를 하면 됩니다.
for i in range(len(word)//2): 는 인덱스 0 부터 문자열 길이의 절반까지를 반복하는 것입니다.
중간의 있는 값을 기준으로 word[i] 와 word[-1-i]를 비교하여 문자가 다르면 회문이 아니기에 false 를 입력하고 break 로 반복문을 끝냅니다.
for 반복문의 i가 0부터 1씩 증가하므로 word[i]는 왼쪽에서 오른쪽으로 진행하고, word[-1 - i]는 오른쪽에서 왼쪽으로 진행합니다.문자열의 마지막 문자는 word[-1]이므로 여기서 인덱스를 i만큼 계속 빼주면 오른쪽에서 왼쪽으로 진행합니다.
for 반복문을 통해 일일히 비교하기보다 조금더 간단한 방법입니다.
word = input('단어를 입력하세요: ') print(word == word[::-1]) # 원래 문자열과 반대로 뒤집은 문자열을 비교
word == word[::-1]은 문자열 전체에서 인덱스를 1씩 감소시키면서 요소를 가져오므로 문자열을 반대로 뒤집습니다. 회문은 순서를 거꾸로 읽어도 제대로 읽은 것과 같은 문자열이므로 원래 문자열 word와 뒤집은 문자열 word[::-1]이 같으면 회문입니다.
반복 가능한 객체의 요소 순서를 반대로 뒤집는 reversed를 사용해도 됩니다.
> list(word) == list(reversed(word)) True
list에 문자열을 넣으면 문자 하나 하나가 리스트의 요소로 들어갑니다. 여기서 reversed로 문자열을 반대로 뒤집어서 list에 넣으면 문자 순서가 반대로 된 리스트를 구할 수 있습니다.
[참고자료] 파이썬 코딩도장 : https://dojang.io/mod/page/view.php?id=2331