회문(回文) 또는 팰린드롬(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을 해주어야 한다!
'프로그래밍 > 코드분석' 카테고리의 다른 글
[파이썬] 사각형의 나머지 한 좌표값 반환하기 (1) | 2017.06.10 |
---|---|
[파이썬] 다음 큰 숫자(next big number) (0) | 2017.06.10 |
소수(Prime Number) 판단 문제 (0) | 2017.01.29 |
continue와 break문의 활용 (0) | 2017.01.28 |
[KATA] Triangular Treasure(삼각수) (0) | 2017.01.26 |