본문 바로가기

프로그래밍/코드분석

[파이썬] 팰린드롬(palindrome) 문제

회문(回文) 또는 팰린드롬(palindrome)은 거꾸로 읽어도 제대로 읽는 것과 같은 문장이나 낱말이다. 보통 낱말 사이에 있는 띄어쓰기나 문장 부호는 무시한다.

예를 들어 내 이름은 거꾸로 해도 이효리 이런 예시가 있다.

'구로구', '부익부' 이런 글자도 모두 팰린드롬에 해당한다.


1. print(is_palindrome("racecar"))
2. print(is_palindrome("stars"))
3. print(is_palindrome("토마토"))
4. print(is_palindrome("kayak"))
5. print(is_palindrome("hello"))


1. True

2. False

3. True

4. True

5. False 가 출력되어야 한다.



  음.. 착안점은 문자열을 리스트로 만들어야 한다. 

  그러면 비교가 쉬워진다.


1. 그래서 is_palindrome 메서드에서 word를 넘겨받자마자 list(word)로 리스트화시킨다.

2. for문에서는 길이의 절반까지만 검사하면 된다.

1) [0] 과 [문자열 끝 - 0]

2) [1] 과 [문자열 끝 - 1]

3) [2] 와 [문자열 끝 - 2]


이런 식으로 비교해나가면 된다.

그래서 range의 범위를 (0, len(list_word) // 2)를 해주었다.

/를 쓰면 float 형식으로 나오기 때문이다. 정수형태로 나오는 //를 사용하자


3. 그래서 차근차근 비교해나가보는데, 여기서 주의할 점이 있다.

for i in range(0, len(list_word) // 2):
print("left index", list_word[i], "right index", list_word[len(list_word) - 1 - i])
if list_word[i] == list_word[len(list_word) - 1 - i]:
return True
else:
return False

if 문 안에다가 return True를 써버리면 [0]과 [맨 마지막 인덱스]만 검사한다

한번 print문으로 찍어봐서 정말 그런지 확인하도록 하자.

left index r right index r

True

ㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡ

left index s right index s

True

ㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡ

left index 토 right index 토

True

ㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡ

left index k right index k

True

ㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡ

left index h right index o

False

여기서 많이 해맸다. 맨 앞글자와 맨 뒷글자가 같기만 하면 뒤에는 조사하지 않고 True로 반환해버린다.

따라서 continue를 써줘서 조건 검사를 계속 실시하게 해야 한다. 대신 if문 밖에 True를 써줘야 한다.


def is_palindrome(word):
list_word = list(word)
for i in range(0, len(list_word) // 2):

if list_word[i] == list_word[len(list_word) - 1 - i]:
continue
else:
return False

return True


마지막으로, len(list-word) - 1 - i 를 해주는 점이 의아할 수 있다.

인덱스는 0부터 시작하고,

len(list)는 1부터 시작하기 때문에


맨 마지막 인덱스를 가르키기 위해서는 len(list) - 1을 해줘야 리스트의 마지막 인덱스를 의미한다.


EX) list = "안녕하세요"

 len(list) = 5

 list[0] = "안", list[1] = "녕", list[2] = "하", list[3] = "세", list[4] = "요"


 따라서, "요"를 출력하고 싶다면 len(list) - 1을 해주어야 한다!