숫자로 이루어진 리스트 nums가 주어졌을 때, 해당 리스트가 회문(palindrome)인지 판별하는 문제입니다. 회문이란 앞에서 읽으나 뒤에서 읽으나 요소의 순서가 동일한 구조를 의미합니다.
예를 들어, 입력이 nums = [10, 12, 15, 12, 10]이라면 어느 방향에서 읽어도 순서가 같으므로 출력은 True가 됩니다.
문제 해결 접근 방법
이 문제는 리스트의 양쪽 끝에서부터 중앙을 향해 요소들을 하나씩 비교하는 방식으로 해결할 수 있습니다. 구체적인 단계는 다음과 같습니다.
n에 nums의 크기를 저장합니다.- 플래그 변수
is_palindrome을 0으로 초기화합니다. i = 0으로 시작합니다.i <= n // 2이면서n != 0인 동안 반복합니다.- 만약
nums[i]와nums[n - i - 1]이 서로 다르다면is_palindrome을 1로 설정하고 루프를 빠져나옵니다. i를 1 증가시킵니다.
- 만약
- 반복이 끝난 후
is_palindrome이 1로 설정되어 있으면False를 반환하고, 그렇지 않으면True를 반환합니다.
아래 구현 예시를 통해 더 자세히 이해해 보겠습니다.
예제 코드
def solve(nums):
n = len(nums)
is_palindrome = 0
i = 0
while i <= n // 2 and n != 0:
if nums[i] != nums[n - i - 1]:
is_palindrome = 1
break
i += 1
if is_palindrome == 1:
return False
else:
return True
nums = [10, 12, 15, 12, 10]
print(solve(nums))입력
[10, 12, 15, 12, 10]
출력
True
더 간단한 대안: 슬라이싱 활용
파이썬에서는 슬라이싱을 활용하면 한 줄로 회문 여부를 확인할 수 있습니다.
def solve(nums):
return nums == nums[::-1]nums[::-1]은 리스트를 거꾸로 뒤집은 새로운 리스트를 반환합니다. 원본 리스트와 비교했을 때 두 리스트가 같다면 회문입니다.
슬라이싱 방식은 코드가 매우 간결하지만, 뒤집힌 리스트를 새로 생성하기 때문에 O(n)의 추가 메모리를 사용합니다. 반면 앞서 소개한 양쪽 끝 비교 방식(투 포인터 기법)은 추가 메모리 없이 O(n) 시간 안에 판별할 수 있으므로, 상황에 맞게 선택하여 사용하면 됩니다.