sort colors

김대익·2022년 3월 31일
0

숫자 배열을 순서대로 넣는 문제
[1 2 0 2 1 0 0 1 2] -> [0 0 0 1 1 1 2 2 2]

  1. 정렬을 사용하면 O(n*lgn)시간 복잡도로 해결가능
  2. 숫자의 개수를 저장해서 해결, O(n)
    0이 3개, 1이 3개, 3이 3개인 것을 저장하고
    낮은 숫자부터 개수만큼 배열에 넣는 방법
  3. inplace-swap을 이용한 방법, O(n)
    moveZeros에서 사용한 방법에 2를 가리키는 인덱스를 추가하기만하면 된다.
void sortColors(int [] nums) {
	int idx0 = 0; //0이 저장될 인덱스
    int idx2 = num.length - 1;//2가 저장될 인덱스
    int i = 0; //현재 인덱스
    
    while (i <= idx2) { //2를 가리키는 인덱스와 현재 인덱스가 서로 지나치면 종료
    	if (nums[i] == 0) { //현재 인덱스의 값이 0이라면
        	swap(nums[i], nums[idx0]); 
            // 0이 저장될 인덱스와 현재 인덱스의 숫자를 서로 바꾸고
            idx0++; //0이 저장될 인덱스와
        	i++; //현재 인덱스를 오른쪽으로 한칸씩 옮긴다
        } else if (nums[i] == 2) { //현재 인덱스의 값이 2라면
        	swap(nums[i], nums[idx2]);
            idx2--; 
            // idx2에 있던 값이 0,1,2 모두 될 수 있으므로
            //i에 옮겨진 값을 한번 더 체크해야해서 i++ 안함
        } else { //현재 인덱스의 값이 1이라면
        	i++;
        }
    }
}

0개의 댓글