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

Python으로 짝수·홀수 인덱스 요소를 서로 교환하는 방법

문제 개요

숫자로 이루어진 리스트 nums가 주어졌을 때, 연속된 짝수 인덱스끼리 서로 교환하고, 연속된 홀수 인덱스끼리도 서로 교환하는 문제입니다.

예를 들어 입력이 [1,2,3,4,5,6,7,8,9]라면 출력은 다음과 같습니다.

[3, 4, 1, 2, 7, 8, 5, 6, 9]

해결 접근 방법

핵심 아이디어는 한 번의 반복으로 두 쌍의 교환을 동시에 처리하는 것입니다. 인덱스를 4씩 건너뛰면서 탐색하면, 짝수 인덱스 그룹(0, 2 / 4, 6 / ...)과 홀수 인덱스 그룹(1, 3 / 5, 7 / ...)을 각각 효율적으로 스왑할 수 있습니다.

  • length := 리스트 nums의 길이
  • i를 0부터 length까지 4씩 증가시키며 반복
    • 만약 i + 2 < length라면 nums[i]nums[i+2]를 교환 (짝수 인덱스 그룹)
    • 만약 i + 3 < length라면 nums[i+1]nums[i+3]을 교환 (홀수 인덱스 그룹)
  • 최종적으로 nums를 반환

경계 조건(i+2, i+3이 길이보다 작은지 확인)을 검사하므로 리스트 길이가 4의 배수가 아니어도 안전하게 동작합니다.

구현 예제

아래 코드를 통해 실제 동작을 확인해 보겠습니다.

class Solution:
    def solve(self, nums):
        length = len(nums)
        for i in range(0, length, 4):
            if(i + 2 < length):
                nums[i], nums[i+2] = nums[i+2], nums[i]
            if(i + 3 < length):
                nums[i+1], nums[i+3] = nums[i+3], nums[i+1]
        return nums

ob = Solution()
nums = [1,2,3,4,5,6,7,8,9]
print(ob.solve(nums))

입력

[1,2,3,4,5,6,7,8,9]

출력

[3, 4, 1, 2, 7, 8, 5, 6, 9]

동작 과정 살펴보기

입력 [1,2,3,4,5,6,7,8,9]에 대해 알고리즘이 어떻게 진행되는지 단계별로 보면 다음과 같습니다.

  • i = 0: 인덱스 0↔2 교환 (1↔3), 인덱스 1↔3 교환 (2↔4) → [3, 4, 1, 2, 5, 6, 7, 8, 9]
  • i = 4: 인덱스 4↔6 교환 (5↔7), 인덱스 5↔7 교환 (6↔8) → [3, 4, 1, 2, 7, 8, 5, 6, 9]
  • i = 8: i+2i+3이 길이 9 이상이므로 교환 없음

결과적으로 마지막 요소 9(인덱스 8)는 교환할 짝이 없어 그대로 유지됩니다.

복잡도 분석

  • 시간 복잡도: O(n) — 리스트를 한 번만 순회하며 상수 시간의 스왑 연산을 수행합니다.
  • 공간 복잡도: O(1) — 추가 메모리 없이 원본 리스트를 제자리(in-place)에서 수정합니다.