문제
회문이란 어떤 단어를 앞으로 읽던 거꾸로 읽던 같은 단어 혹은 문장을 말합니다. 예를 들어 civic, radar, level, rotor, refer 같은 단어는 회문입니다. 소문자 알파벳, 공백(“ “), 마침표(.)로 이루어진 문장에서 알파벳만 추출하였을 때 회문이면 회문 문장이 됩니다. “never odd or even.”과 같은 문장은 회문입니다. 소문자 알파벳, 공백(“ “), 마침표(.)로 이루어진 문장이 회문인지 아닌지를 return 하는 solution 함수를 작성하세요.
입력
sentence | return |
"never odd or even" | true |
"palindrome" | false |
예시 #1 알파벳과 숫자만 추출하여 소문자로 변환해보면 "neveroddoreven"이 되며 이 단어는 팰린드롬입니다.
예시 #2 문장의 맨 앞 문자인 "p"와 맨 뒤 문자인 "e"가 다르므로 팰린드롬이 아닙니다.
1차 시도
# 1차 시도
import sys
input = sys.stdin.readline
n = input().lower().replace(" ", "")
# n[::-1] -> reverse된 문자열
if n == n[::-1]:
print("true")
else:
print("false")
계속 테스트해도 true여야하는 값이 false로 계속 뜨길래
print(n)
print(n[::-1]
출력 시켜봤는데 둘다 값이 똑같이 뜬다.
뭐가 문제인지 아무리 생각해봐도 모르겠어서 찾아보니 n에 strip()함수로 공백을 제거해야 된다고 한다.
근데 나는 이미 replace로 공백을 제거했는데,,?? 정말 모르겠어서 챗지피티의 도움을 받았다.
알고보니 sys.stdin.readline으로 입력 받으면 끝에 \n이 포함되기 때문에 이거를 없애기 위해 strip()을 사용해야 된다고 한다. 그래서 그렇다고 replace대신에 strip을 쓰는건 안된다. strip()은 양끝(lstrip()은 왼쪽, rstrip()은 오른쪽) 공백 없애지 중간에 있는 공백까지는 없애지 않는다. 그래서 최종 코드는 아래와 같다.
# 정답
import sys
input = sys.stdin.readline
n = input().lower().strip().replace(" ", "")
# n[::-1] -> reverse된 문자열
if n == n[::-1]:
print("true")
else:
print("false")
이 문제에서 [::-1] reverse된 문자열이라는 것을 처음 알았고,
lower()을 하는 이유는 파이썬에서 대소문자 구분을 하기 때문에 소문자 혹은 대문자 하나로 통일 시켜야 비교가 가능하기 때문이다.
'코테 공부 > Computer Algorithm' 카테고리의 다른 글
[2024 알고리즘 특강] 공항 방문수 (파이썬) (0) | 2024.05.16 |
---|---|
[2024 알고리즘 특강] 가장 긴 팰린드롬 - 프로그래머스 (파이썬) (0) | 2024.05.16 |
[이코테] 두 배열의 원소 교체 (파이썬) (0) | 2024.04.05 |
[이코테] 정렬 알고리즘 코드 정리 (파이썬) (0) | 2024.04.05 |
[이코테] 구현 - 상하좌우 (파이썬) (0) | 2024.03.28 |