Computer >> 컴퓨터 >  >> 프로그래밍 >> Python

Python으로 리스트가 회문(Palindrome)인지 확인하는 방법

숫자로 이루어진 리스트 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) 시간 안에 판별할 수 있으므로, 상황에 맞게 선택하여 사용하면 됩니다.