Problem
난이도 Medium 문제입니다.
빨간색, 파란색, 하얀색이 각각 0, 1, 2 로 주어지고 이 숫자들을 정렬하는 문제입니다.
단, 라이브러리에서 제공하는 정렬 함수를 사용하면 안됩니다.
Solution
문제에서는 Counting Sort
로 O(2n)
만에 풀 수 있다고 언급했습니다.
0, 1, 2 의 갯수를 센 다음에 0, 0, 1, 1, .. 이렇게 주르륵 나열하면 됩니다.
O(n)
시간복잡도와 O(1)
공간복잡도로 문제를 풀려면 문제에 제시된 조건을 파악해야합니다.
이 문제는 단 세가지 숫자 0, 1, 2 만으로 이루어져 있습니다.
포인터 세개를 이용하여 양 끝에 두개의 포인터를 두고 나머지 하나는 증가시키면서 0 과 2를 양끝으로 보내면 됩니다.
0 을 만나면 왼쪽으로, 2를 만나면 오른쪽으로 보내고 1은 신경쓰지 않습니다.
0과 2가 다 보내지고 나면 1은 자동으로 가운데에 남아있게 됩니다.
그리고 증가하던 i
포인터가 right
포인터와 만나면 더이상 swap
할 게 없기 때문에 종료합니다.
포인터의 위치를 신경쓰며 구현만 잘 해주면 풀 수 있습니다.
Java Code
class Solution {
public void sortColors(int[] nums) {
int left = 0;
int right = nums.length - 1;
for (int i=0; i<=right; i++) {
if (nums[i] == 0) {
swap(nums, i, left++);
}
if (nums[i] == 2) {
swap(nums, i--, right--);
}
}
}
public void swap(int[] nums, int a, int b) {
int temp = nums[a];
nums[a] = nums[b];
nums[b] = temp;
}
}
'알고리즘 문제 > LeetCode' 카테고리의 다른 글
[LeetCode Medium] Battleships in a Board (Java) (0) | 2020.03.30 |
---|---|
[LeetCode Easy] Remove All Adjacent Duplicates In String (Java) (0) | 2020.03.25 |
[LeetCode Easy] Reverse Linked List (Java, Kotlin) (0) | 2019.12.12 |
[LeetCode Easy] Single Number (Java, Kotlin) (0) | 2019.12.11 |
[LeetCode Easy] Maximum Depth Of Binary Tree (Java, Kotlin) (0) | 2019.12.02 |