이번 문제는 투 포인터를 활용하여 정렬 처리를 할 수 있는지에 대한 문제였다.(이 문제는 단순 버블정렬 등의 알고리즘을 통해 처리하더라도 Pass가 됨.)
해당 문제 접근시 일단 0은 무조건 왼쪽으로 배치하고 2는 오른쪽으로 배치하도록 처리하고자 하였다.
변수는 크게 3가지 변수로 선언하였다.
Lower Bound 인덱스를 의미하는 a,Upper Bound 인덱스를 의미하는 b 그리고 탐색하는 목적의 인덱스 i 변수이다.
알고리즘 동작 방식은 하기와 같다.
1. 최초 하한,상한,탐색 3가지 변수 선언
2. 탐색변수가 0을 만나면 하한과 교체하고 하한 범위를 +1
3. 탐색변수가 2를 만나면 상한과 교체하고 상한 범위를 -1
4. 탐색변수가 상한보다 크게 되면 탐색 종료
해당 알고리즘에서는 아래 3가지를 목표로 움직이게 된다. 만약 탐색변수가 b보다 크게 되면 2,3번의 목적이 달성되지 않고 2가 1보다 이전에 위치하게 되므로 종료하여야 한다.
1) 배열의 첫 글자 ~하한 인덱스 전까지는 0으로 이미 정렬된 상태
2) 하한 인덱스 ~ 탐색변수 전까지는 1로 채워진 상태
3) 상한 인덱스+1 ~ 마지막 변수까지는 2로 정렬된 상태
1. 제출 소스
class Solution:
def sortColors(self, nums: List[int]) -> None:
"""
Do not return anything, modify nums in-place instead.
"""
i,a,b=0,0,len(nums)-1
while(i<=b):
if nums[i]==0:
# print("k",i)
nums[a],nums[i]=nums[i],nums[a]
a+=1
i+=1
#print(nums)
elif nums[i]==2:
nums[b],nums[i]=nums[i],nums[b]
b-=1
else:
i+=1
2. 속도 개선 버전
class Solution:
def sortColors(self, nums: List[int]) -> None:
"""
Do not return anything, modify nums in-place instead.
"""
i,a,b=0,0,len(nums)-1
while(i<=b):
if nums[i]==0 and i > a:
# print("k",i)
nums[a],nums[i]=nums[i],nums[a]
a+=1
#print(nums)
elif nums[i]==2 and i < b:
nums[b],nums[i]=nums[i],nums[b]
b-=1
else:
i+=1