1. ๋ฌธ์ ์ค๋ช ๐
ํด๋น ๋ฌธ์ ๋ ์์ ์ด ์ฌ์ฉํ๋ ์ธ์ด์ ๋ด๋ถ ๋ผ์ด๋ธ๋ฌ๋ฆฌ ์ ๋ ฌ์ ์ฌ์ฉํ์ง ์๊ณ O(nlog(n))์ ๋ฌธ์ ๋ฅผ ํธ๋ ๊ฒ์ด ๊ด๊ฑด์ด๋ค.
(๋ฌธ์ ์์๋ ์ง์ง ๋ผ์ด๋ธ๋ฌ๋ฆฌ ์ ๋ ฌ์ ์ผ๋์ง ์ ์ผ๋์ง๋ ์์ฌ์ ๋งก๊ฒผ๋ค...)
2. ์ ๊ทผ ๋ฐฉ์ ๐๏ธ
Key word
: Merge sort
๋ณํฉ ์ ๋ ฌ์ ์ต์ ์ ์๊ฐ ๋ณต์ก๋๊ฐ O(nlog(n))์ด๊ธฐ ๋๋ฌธ์ ์ฐ๋ฉด ํ๋ฆฐ๋ค. ํ์ง๋ง ํ ๊ฐ์ง ๋ฐฑ์ค๊ณผ ๋ค๋ฅธ ์ ์ด ์์ด 1์๊ฐ ๋์ ํค๋ฉ ๋ถ๋ถ์ด ์๋ค.
๋ฆฌํธ์ฝ๋๋ ์๊ณ ๋ฆฌ์ฆ ์์ฒด์ ์๊ฐ ๋ฟ๋ง ์๋๋ผ, ์๋ฃ๊ตฌ์กฐ๋ฅผ ์ฌ์ฉํ๋ฉฐ ์๊ธฐ๋ ๋ฉ๋ชจ๋ฆฌ ์ค๋ฒ ํค๋, ๊ฐ๋น์ง ์ปฌ๋์
๋ถ๋ด์ ๋ฐ๋ฅธ ์คํ ์๊ฐ ์ฆ๊ฐ ๋ํ ์คํ์๊ฐ
์ ํฌํจ์ํค๋ ๋ฏ ํ๋ค.
๊ทธ๋ ๊ฒ ๋๋ ์ด์ ๋ ๋ด๊ฐ Merge_sort๋ฅผ ํ๋ฉด์ ๋ถ๋ถ ์ ๋ ฌ๋ ๊ฐ๋ค์ ๋ฃ์ tmp ์์ ๋ฐฐ์ด์ ๋งค ์ฌ๊ท๋ง๋ค ์๋ก ํธ์ถํ์๋๋, TLE๊ฐ ๋ฐ์ํ๊ธฐ ๋๋ฌธ์ด๋ค. ํด๋น ์์๋ฐฐ์ด์ static์ผ๋ก ๋จ ํ๋ฒ๋ง ์ค์ ํ๊ฒ ํด์ฃผ๋ ๋ฌธ์ ๊ฐ ํ๋ ธ๋ค. ์ฌ๋ฌ ์ธ๊ตญ์ธ์ ์ฝ๋๋ฅผ ์ดํด๋ณด๋, ๋ค๋ค ๋น์ฐํ๋ค๋ ๋ฏ์ด ์ด๋ฐ ์์ผ๋ก ์์ฃผ ํ์ฉ๋๋ ์๋ฃ๊ตฌ์กฐ๋ ์ฌํ์ฉํ๋ ์์ผ๋ก ๋ฌธ์ ๋ฅผ ํ์๋๋ผ.
๊ณต๊ฐ ๋ณต์ก๋ ๋ญ๋น๋ฅผ ๊ทธ์ ๊ณต๊ฐ ๋ณต์ก๋์ ํ์ ์ํค์ง ์๊ณ ๊ทธ ์ฌํ๋ก ์๊ธฐ๋ ๋ฉ๋ชจ๋ฆฌ ์ค๋ฒ ํค๋, ๊ฐ๋น์ง ์ปฌ๋์ ์ฌ์ฉ ํ์๋ ์๊ฐ๋ณต์ก๋์ ํฌํจ์ํจ ๋ฆฌํธ ์ฝ๋์ ๋๋ฌ๋ค.
3. ์ฝ๋ ์๊ฐ ๐
(1) ์ฑ๊ณตํ ์ฝ๋
class Solution {
private static int [] tmp;
public int[] sortArray(int[] nums) {
tmp = new int [nums.length];
merge_sort(nums, 0, nums.length-1);
return nums;
}
public void merge_sort(int [] nums, int start, int end) {
// 0. ๊ธฐ์ ์กฐ๊ฑด
if(start >= end) return;
int mid = start + (end-start)/2;
merge_sort(nums, start, mid);
merge_sort(nums, mid+1, end);
for(int i = start; i <= end; i++){
tmp[i] = nums[i];
}
int L = start; int R = mid+1; int E = start;
while(L <= mid && R <= end){
if(tmp[L] <= tmp[R]){
nums[E++] = tmp[L++];
}else {
nums[E++] = tmp[R++];
}
}
if(L <= mid) {
while(L <= mid){
nums[E++] = tmp[L++];
}
}
}
}
(2) TLE๊ฐ ๋ ์ฝ๋
class Solution {
public int[] sortArray(int[] nums) {
merge_sort(nums, 0, nums.length-1);
return nums;
}
public void merge_sort(int [] nums, int start, int end) {
// 0. ๊ธฐ์ ์กฐ๊ฑด
if(start >= end) return;
int [] tmp = new int [nums.length];
int mid = start + (end-start)/2;
merge_sort(nums, start, mid);
merge_sort(nums, mid+1, end);
for(int i = start; i <= end; i++){
tmp[i] = nums[i];
}
int L = start; int R = mid+1; int E = start;
while(L <= mid && R <= end){
if(tmp[L] <= tmp[R]){
nums[E++] = tmp[L++];
}else {
nums[E++] = tmp[R++];
}
}
if(L <= mid) {
while(L <= mid){
nums[E++] = tmp[L++];
}
}
}
}
4. ๋ฐฐ์ด ๊ฒ๋ค ๐ฏ
๋ฐฐ์ด ๊ฒ์ 2๋ฒ ์ ๊ทผ๋ฐฉ์์ ๋ค ์ ์ด๋ฒ๋ ธ๋ค ใ