문제 개요
숫자로 이루어진 리스트 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+2와i+3이 길이 9 이상이므로 교환 없음
결과적으로 마지막 요소 9(인덱스 8)는 교환할 짝이 없어 그대로 유지됩니다.
복잡도 분석
- 시간 복잡도: O(n) — 리스트를 한 번만 순회하며 상수 시간의 스왑 연산을 수행합니다.
- 공간 복잡도: O(1) — 추가 메모리 없이 원본 리스트를 제자리(in-place)에서 수정합니다.