문제
정답 소스코드 (Python)
Source 1
word=input()
if list(word)==list(reversed(word)):print(1)
else:print(0)
Source 2
word=input()
if word==word[::-1]:print(1)
else:print(0)
풀이 (Python)
팰린드롬의 문제는 알고리즘 공부를 하다 보면 자주 마주치게 되는 유명한 문제이다. 다이나믹 프로그래밍(dp) 문제로 써도 활용되며, 이 문제와 같이 간단하게 문자열을 다루는 포인트의 문제로도 사용되기도 한다.
10988번 문제의 경우 앞에서 뒤로 읽을 때와 뒤에서 앞으로 읽을 때만 체크하면 되는 경우로 매우 단순한 문제이다. 특히 파이썬의 언어 특성상 String(문자열)에 대해 유연하게 처리가 가능하기에 수월하다.
Point 1) 매 원소를 비교하는 것이 아닌 전체를 바꿔서 비교하자.
for i in range(len(word)):if word[i]==word[len(word)-1-i]
간단히 예시를 들어보았다 보통 첫 접근을 위의 반복문을 통해 원소마다 맞는지 검사하는 경우가 있는데 이러한 경우 문자열이 짝수인지 홀수인지 case를 분리해야 하며, 시간복잡도가 증가한다. 즉 효율적이지 못한 풀이라고 볼 수 있다.
이 문제의 경우 간단하게 확인만 하면 되는 경우 이기 때문에 문자열의 매 원소를 반대로 체크하는 것보다 문자열 전체를 뒤집는 방법이 더 효율적인 풀이라고 볼 수 있다. 그러면 어떻게 문자열을 뒤에서부터 읽은 것으로 바꿀 수 있을까?
Point 2) 리스트 reverse와 reversed
파이썬 리스트에서는 reverse 함수를 통해 리스트를 뒤집을 수 있다. arr=[ 1, 2, 3, 4]가 있다고 할 때 print(arr.reverse())의 결과는 [ 4, 3, 2, 1]로 출력된다.
하지만 reverse 함수는 리턴값이 없다.
arr=[ 1, 2, 3, 4]
arr2=arr.reverse()
print(arr2)
이처럼 코드를 작성한 경우 NONE을 출력한다.
reversed는 리스트만 뒤집을 수 있는 것이 아닌, 여러 가지 자료형을 뒤집을 수 있으며 문자열도 뒤집을 수 있다. 또한 reversed는 리턴값이 존재한다.
이러한 점을 활용하여 10988번 문제에서는 reversed를 사용하여 풀이하면 간단하게 풀 수 있다. 하지만 reversed를 사용하여 나온 리턴값은 뒤집기 전 자료형과 다르기 때문에 list로 통일하여 list(word)와 list(reversed(word))를 비교하면 된다.
if list(word)==list(reversed(word)):print(1)
Point 3) 문자열 슬라이싱
파이썬에서는 리스트에 다양한 함수 지원뿐만 아닌 문자열에 다양한 기능들을 제공한다. 제일 대표적으로는 문자열 슬라이싱 기능인데 for문의 range()와 비슷하게 start, end, step이 존재한다. 이것을 구분 짓기 위해서 :을 사용하며 기본형은 [ start : end : step]이다. step=-1인 경우 뒤에서부터 한 칸씩 앞으로 읽어 나가므로 reversed와 같은 기능을 하려면 [::-1]을 사용하면 된다.
if word==word[::-1]:print(1)
위의 문제 포인트 들을 모두 해결한 뒤에 팰린드롬이 아닌 경우 0을 출력해야 하기에 else문만 추가해 주면 간단하게 풀 수 있는 문제이다.
else:print(0)
파이썬의 기본 문법을 숙지하고 있고, 각 매 원소별 비교가 아닌 전체를 뒤집어서 비교하는 것만 인지한 후 풀이하면 매우 쉽게 풀리는 문제라 할 수 있다.
'Baekjoon' 카테고리의 다른 글
[백준] 20055번 컨베이어 벨트 위의 로봇 (파이썬) (0) | 2024.01.12 |
---|---|
[백준] 2304번 창고 다각형 (파이썬) (0) | 2024.01.12 |
[백준] 1476번 날짜 계산 (파이썬) (0) | 2024.01.12 |
[백준] 2231번 분해합 ( 파이썬 ) (0) | 2024.01.12 |
[백준] 1987번 알파벳 ( 파이썬) (0) | 2023.10.12 |