1. ๊ธฐ์ ์ ๋ ฌ์ด๋?
์๋ค์ ์๋ฆฟ๊ฐ
์ ํ์ฉํด, ๋ฐ์ดํฐ๋ฅผ ์ ๋ ฌํ๋ ์ ๋ ฌ๋ฐฉ๋ฒ
(์ง๊ธ๊น์ง ๋ฐฐ์ด ์ ๋ ฌ๋ค์ ์ ๋ค๊ฐ์ ๋์ ๊ด๊ณ๋ฅผ ๋น๊ตํ๋ ๋น๊ต ์ ๋ ฌ์ด์์ง๋ง, ๊ธฐ์ ์ ๋ ฌ์ ๋ฐ์ดํฐ ๊ฐ์ ๋์ ๊ด๊ณ๋ฅผ ๋น๊ตํ์ง ์์.)
์๊ฐ ๋ณต์ก๋๋ O(kn)
์ด๋ค. ์ฌ๊ธฐ์ K๋ ์
๋ ฅ์ผ๋ก ์ฃผ์ด์ง ๋ฐ์ดํฐ ์ค ๊ฐ์ฅ ํฐ ์๋ฆฟ๊ฐ์ ๋งํ๋ค. ์ฝ๋ฉํ
์คํธ์์๋ ์ต๋๊ฐ์ด 10์ต์ ๋์ด๊ฐ๋ ๊ฒฝ์ฐ๊ฐ ๋๋ฌผ๊ธฐ ๋๋ฌธ์ ์ค์ง์ ์ผ๋ก O(N)
์ ์๊ฐ์์ ์ ๋ ฌ์ด ๊ฐ๋ฅํ๋ค๋ ์๋ฆฌ์ด๋ค.
ํ์ง๋ง ๊ฐ์ฒ ์ ์ฐ๊ธ์ ์ฌ์ฒ๋ผ ๋ฑ๊ฐ๊ตํ์ ์์น์ด๋ค. ํด๋น ์ ๋ ฌ์ ๊ตฌํํ๊ธฐ ์ํด์ ์๋๋ Queue๊ฐ 10๊ฐ๊ฐ ํ์ํด์ ๋ฉ๋ชจ๋ฆฌ๋ฅผ ๋ง์ด ์ก์๋จน๋๋ค. ์ด๋ฌํ ๋ฉ๋ชจ๋ฆฌ ์ฌ์ฉ๋์ ์ค์ด๊ธฐ ์ํด ๋ณธ ํฌ์คํ
์์๋ ๋์ ํฉ ๋ฐฐ์ด
์ ์ด์ฉํ ๊ตฌํ ๋ฐฉ๋ฒ์ ์๊ฐํ๊ฒ ๋ค.
2. ์๋ฆฌ
0. ์ธํ
ํ์ฌ ํ์ธ ์ค์ธ ์๋ฆฟ๊ฐ์ ๊ฐ์ง ์ซ์๊ฐ ์ผ๋ง๋ ์๋์ง ๊ฐ์๋ฅผ count ํ๋ ๋ฐฐ์ด์ด ํ์
(index - ์๋ฆฟ๊ฐ 0์์ 9, value - ํด๋น ์๋ฆฟ๊ฐ์ ๊ฐ์ง ์์ ๊ฐ์)
1. ๊ตฌํ ๋ฐฉ์
- (0) ์ฃผ์ด์ง ๋ฐ์ดํฐ์์ ์ ์ผ ๋์ ์๋ฆฟ์ ํ์ธ (๋ฐ๋ณต ์ผ๋ง๋ ํ ๊ฒ์ธ์ง ์ฒดํฌ)
- (1) ํ์ฌ ์๋ฆฟ๊ฐ ๊ธฐ์ค์ผ๋ก ํด๋น ์๋ฆฟ๊ฐ์ ๊ฐ์ง ์์ ๊ฐ์๋ฅผ ์ธ์ด ์๋ฆฟ๊ฐ ๋ฐฐ์ด์ ์์ฑ
- (2) ์๋ฆฟ๊ฐ ๋ฐฐ์ด์ ๊ฐ์
index = 0
์์ ๋ถํฐ ๋์ ์ํจ๋ค. (๋์ ํฉ ๋ฐฐ์ด๋ก ๋ง๋ค๊ธฐ) - (3) ๋ค์ ์ฃผ์ด์ง ์ ๋ ฅ ๋ฐ์ดํฐ์ ๋งจ ๋๊ฐ๋ถํฐ ํ์ธํ๋ค.
- (3-1) ํ์ฌ ์กฐํ ์ค์ธ ๋ฐ์ดํฐ์ ๋์ ํฉ ๋ฐฐ์ด์ ๊ฐ์ ํ์ธํ๊ณ , ๊ฒฐ๊ณผ ๋ฐฐ์ด์ index์ ๊ทธ ๊ฐ์ด ์ผ์นํ๋ ์์น์ ํ์ฌ ์กฐํ์ค์ธ ๋ฐ์ดํฐ๋ฅผ ๋ฃ๋๋ค.
(์๋ฅผ ๋ค์ด 34 ๋ ๋์ ํฉ ๋ฐฐ์ด์index = 4
์ธ ๊ณณ์ ๋ณด๊ณ ์๊ณ , ๊ทธ ๊ฐ์ด 3์ด๋ผ๋ฉด, ๊ฒฐ๊ณผ ๋ฐฐ์ด์์index = 3
์ธ ๊ณณ์ 34๋ฅผ ์ง์ด๋ฃ๋๋ค.) - (3-2) 3๋ฒ์ ๊ณผ์ ์ ํตํด ๊ฒฐ๊ณผ ๋ฐฐ์ด์ ๋ค ๋ง๋ค์์ผ๋ฉด, ์ด์ ํด๋น ๋ฐฐ์ด์ ๊ธฐ์ค์ผ๋ก ๋ค์
(1)
์์(3)
๋ฒ ๊ณผ์ ์ ๋ฐ๋ณตํ๋ค.
3. ์์
์์์์๋ ์ดํด๋ฅผ ๋๊ธฐ ์ํด ๋์ ํฉ ๋ฐฐ์ด๊ณผ ์ผ๋ฐ ๋ฐฐ์ด์ ๋๋์ด ๋์๋ค. ๋ฌธ์ ๋ฅผ ํ ๋๋ ๊ธฐํธ์ ๋ฐ๋ผ ๋ ๊ฐ๋ฅผ ํ ๋ฐฐ์ด์ ํผ์ฉํด์ ์ฌ์ฉํด๋ ๋๋ค.
0. ์ต๋ ์๋ฆฟ์ ํ์ธํ๊ธฐ
ํด๋น ๋ฌธ์ ์์๋ 803์ด 3์๋ฆฌ๋ก ์ด๋ฃจ์ด์ ธ ์๋ ์ต๋๊ฐ ์ด๋ค. ๋ฐ๋ผ์ ํด๋น ๋ฐฐ์ด์ ์ ๋ ฌํ๊ธฐ ์ํด 3
๋ฒ์ ๋ฐ๋ณต์ด ํ์ํ๋ค.
1. 1
์ ์๋ฆฌ๋ก ์๋ฆฟ๊ฐ ๋ฐฐ์ด ๋ง๋ค๊ธฐ
ํ์ธํด์ผํ ์ซ์๋ ๊ฐ ์์ ๋น ํ์ํ ์๋ฆฟ๊ฐ์ ์์ด๋ค.
์๋ฆฟ๊ฐ ๋ฐฐ์ด์ ๋ง๋ค๋ฉด ์์ ๊ฐ์ด ๋๋ค. ์ด์ ๋ค์ ๋ฐ์ดํฐ๋ฅผ ๋์์ ๋ถํฐ ์ฝ์ผ๋ฉด์ ๊ฒฐ๊ณผ ๋ฐฐ์ด์ ์ฑ์๊ฐ๊ฒ ๋ค.
42์ 1์ ์๋ฆฌ๊ฐ์ 2
์์ผ๋ก ๋์ ํฉ ๋ฐฐ์ด์์ index = 2
์ธ ๊ณณ์ ํ์ธํ๋ค. ํด๋น ์์น์ ๊ฐ์ 2
์์ผ๋ก ๊ฒฐ๊ณผ ๋ฐฐ์ด์ index = 2
์ธ ์ง์ ์ 42๋ฅผ ์ง์ด๋ฃ๋๋ค. ์ดํ ๋์ ํฉ ๋ฐฐ์ด์์ ๊ฐ์ ํ๋ ์๋ชจ ํ์์ผ๋ก, -1 ํ๋ค. (์๋ฆฟ์๊ฐ ๊ฐ์ ๊ฐ์ด ๋ค์์ ๋ค์ด๊ฐ ์์น๋ฅผ ์ ํํ ํ๊ธฐ ์ํจ)
ํด๋น ๊ฒฐ๊ณผ ๋ฐฐ์ด์ 1์ ์๋ฆฟ์๋ฅผ ๊ธฐ์ค์ผ๋ก ๊ธฐ์ ์ ๋ ฌํ ๊ฐ์ด๋ค. ์ด์ ํด๋น ๋ฐฐ์ด์ ์๋ณธ์ผ๋ก ๋ค์ 10์ ์๋ฆฌ์ ๋ํด์ ์งํํ๋ฉด ๋๋ค.
10์ ์๋ฆฌ๋ ์ฒซ ์์๊ณผ ๋๋ง ๋ณด์ฌ์ฃผ๊ณ ๋์ด๊ฐ๊ฒ ๋ค.
๋ง์ง๋ง์ธ 100์ ์๋ฆฌ์ ๋ํ ์๋ฆฌ๊ฐ ๋ฐฐ์ด ์์ฑ ๋ฐ ์ ๋ ฌ ๋ํ ์์๊ณผ ๋๋ง ๋ณด์ฌ์ฃผ๊ฒ ๋ค.
๋ณด๋ค์ํผ ์ต์ข ํํ์์๋ ๊ฐ์ด ์์ ํ ์ ๋ ฌ ๋์๋ค.
4. ์ฝ๋
import java.io.*;
import java.util.ArrayList;
import java.util.Arrays;
import java.util.StringTokenizer;
public class Main {
public static void main(String[] args) throws IOException {
BufferedReader br = new BufferedReader(new InputStreamReader(System.in));
StringTokenizer st = new StringTokenizer(br.readLine());
int [] arr = new int [st.countTokens()+1];
int i = 1;
while (st.hasMoreTokens()){
arr[i++] = Integer.parseInt(st.nextToken());
}
radix_sort(arr, 1);
System.out.println(Arrays.toString(arr));
}
public static void radix_sort (int [] arr, int digit) {
// 0. num ๋ฐฐ์ด์ ๊ฐ ์ซ์ ๋ณ๋ก ํ ์๋ฆฟ์๊ฐ ๋ฌด์์ธ์ง ๊ธฐ๋กํ๊ธฐ
int [] nums = new int [10];
for (int i = 1; i < arr.length; i++) {
nums[(arr[i]/digit)%10]++;
}
// 0. ๊ธฐ์ ์กฐ๊ฑด - ๋ฌธ์ ์์ ์ค ์ ์๋ ๋ฐ์ดํฐ์ ์ต๋ ์๋ฆฟ์ + 1 ๋งํผ ๋ฃจํ ๋๋ฉด ๋น ์ ธ๋์จ๋ค.
if(nums[0] == "[[์ต๋ ์๋ฆฟ์ + 1]](๋ฌธ์ ์ ๋ฐ๋ผ ๋ฐ๊พธ์ธ์!)") return;
// 2. ๋์ ํฉ ๋ง๋ค๊ธฐ
for (int i = 1; i < nums.length; i++) {
nums[i] += nums[i-1];
}
// 3. ํ ์์ ๊ฒฐ๊ณผ ๋ฐฐ์ด ๋ง๋ค๊ธฐ
int [] results = new int [arr.length];
for (int i = arr.length-1; i >= 1; i--) {
int pos = nums[(arr[i]/digit)%10];
results[pos] = arr[i];
nums[(arr[i]/digit)%10]--;
}
// 4. ๊ฒฐ๊ณผ ๋ฐฐ์ด ์ฎ๊ธฐ๊ธฐ
for (int i = 1; i < arr.length; i++) {
arr[i] = results[i];
}
radix_sort(arr, digit*10);
}
}
์์ ์ ๊ฒฐ๊ณผ ๋ฐฐ์ด์ ์์ index๊ฐ 1์ธ ๊ฒ์์ ์ ์ ์๋ฏ์ด ๋์ ํฉ ๋ฐฐ์ด์ ๊ฐ์ ๊ทธ๋๋ก ์ธ๋ ค๋ฉด ๊ฒฐ๊ณผ๋ฐฐ์ด์ ์์ index๋ฅผ 1๋ถํฐ ์์ํ๊ฒ ์กฐ์ ํด์ค์ผ ํ๋ค. ๋ด ์ฝ๋ ์ญ์ ๊ทธ๋ ๋ค. ๋ฐ๋ผ์ arr[0] = 0์ ๊ฐ์ ์ ๋ ฌ์ ์ฌ์ฉํ์ง ์์ ๊ฐ์ด๋ ๋ฌด์ํด์ฃผ์.