[PS] 99ํด๋ฝ ์ฝํ ์คํฐ๋ 3์ผ์ฐจ TIL (๋ฌธ์์ด ๋ด ๋ง์๋๋ก ์ ๋ ฌํ๊ธฐ)
ํ๊ทธ: 99ํด๋ฝ, PS, TIL, ๋ฌธ์์ด, ์ฝ๋ฉํ ์คํธ์ค๋น, ํญํด99
์นดํ ๊ณ ๋ฆฌ: PS
๋ฌธ์
ํ์ด
์ฒซ๋ฒ์งธ ํ์ด (O(n^2))
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
class Solution {
public String[] solution(String[] strings, int n) {
for (int i = 0; i < strings.length; i++) {
for (int j = i + 1; j < strings.length; j++) {
char c = strings[i].charAt(n);
char c1 = strings[j].charAt(n);
if (c > c1) {
String tmp = strings[i];
strings[i] = strings[j];
strings[j] = tmp;
} else if (c == c1) {
if (strings[i].compareTo(strings[j]) > 0) {
String tmp = strings[i];
strings[i] = strings[j];
strings[j] = tmp;
}
}
}
}
return strings;
}
}
์ด์ค for ๋ฌธ์ ์ฌ์ฉํด ๋ฌธ์์ด์ ๋น๊ตํ๋ฉด์ ๋ฒ๋ธ์ ๋ ฌํ๋ค.
์ฒซ๋ฒ์งธ ์กฐ๊ฑด๋ฌธ์์ ์ธ๋ฑ์ค์ ํด๋นํ๋ ์ํ๋ฒณ์ ์์คํค ์ฝ๋๊ฐ์ ๋น๊ตํ๋ค.
๋ง์ฝ ์์ ์ฝ๋๊ฐ์ด ๋ ํฐ ๊ฐ์ ๊ฐ์ง๋ค๋ฉด ๋ฒ๋ธ์ ๋ ฌ์ ํตํด ์๋ฆฌ๋ฅผ ๋ฐ๊ฟ์ค๋ค.
๊ฐ์ ์ฝ๋๊ฐ์ ๊ฐ๋ ์ํ๋ฒณ์ ๊ฒฝ์ฐ์ ์ํ๋ฒณ์ ์ฌ์ ์์ผ๋ก ์ ๋ ฌํ๋ค. ์ด๋ compareTo()
๋ฉ์๋๋ฅผ ์ด์ฉํ๋ฉด ๋ฌธ์์ด์ ์ฝ๊ฒ ๋น๊ตํ ์ ์๋ค.
(๊ธฐ์ค๊ฐ๊ณผ ๋น๊ต๋์์ด ๊ฐ์ผ๋ฉด 0, ๊ธฐ์ค๊ฐ์ด ๋ ํฐ ๊ฒฝ์ฐ ์์, ๋น๊ต๋์์ด ๋ ํฐ๊ฒฝ์ฐ ์์)
strings[i].compareTo(strings[j]) > 0
์ ๊ธฐ์ค๊ฐ์ด ๋น๊ต๋์๋ณด๋ค ๋ ํฐ ๊ฒฝ์ฐ๋ฅผ ์๋ฏธํ๋ค. ๋ฐ๋ผ์ ์ด ๊ฒฝ์ฐ์ ์ค๋ฆ์ฐจ์(์ฌ์ ์)์ด ๋๋๋ก ์๋ฆฌ๋ฅผ ๋ฐ๊ฟ ์ค์ผํ๋ค.
ํด๋น ๋ฐฉ์์ ๋ชจ๋ ์์๋ฅผ ๋น๊ตํ๋ ๋ฒ๋ธ ์ ๋ ฌ์ ์ด์ฉํ๊ธฐ ๋๋ฌธ์ ํจ์จ์ด ์ข์ง์๋ค. ๋ํ for ๋ฌธ๊ณผ if ๋ฌธ์ด ๋ง์ ๊ฐ๋ ์ฑ์ด ์ข์ง ์๋ค.
๋๋ฒ์งธ ํ์ด (O(n log n))
1
2
3
4
5
6
7
8
9
10
11
12
13
class Solution {
public String[] solution(String[] strings, int n) {
Arrays.sort(strings, (o1, o2) -> {
if (o1.charAt(n) == o2.charAt(n)) {
return o1.compareTo(o2);
} else {
return o1.charAt(n) - o2.charAt(n);
}
});
return strings;
}
}
์๋ฐ์์ ๋ฐฐ์ด์ ์ ๋ ฌ์ Arrays.sort()
๋ฅผ ์ด์ฉํด์ ์ฝ๊ฒ ํ ์ ์๋ค. ๋ฉ์๋์ ์ฒซ๋ฒ์งธ ํ๋ผ๋ฏธํฐ๋ก ์ ๋ ฌํ๊ณ ์ ํ๋ ๋ฐฐ์ด์ ์ฃผ๊ณ , ๋๋ฒ์งธ ํ๋ผ๋ฏธํฐ์์ ์ ๋ ฌ ๋ฐฉ์์ ์ค์ ํ๋ค.
๋๋ฒ์งธ ํ๋ผ๋ฏธํฐ๋ Comparator
์ธํฐํ์ด์ค์ compare()
๋ฉ์๋ ๊ตฌํ์ฒด๋ฅผ ์ ๋ฌํด ์ฃผ๋ฉด๋๋ค.
compare() ๋ฉ์๋๋ ๋ ์ธ์๋ฅผ ํ๋ผ๋ฏธํฐ๋ก ์ ๋ฌ๋ฐ์ ์๋ก ๋น๊ตํ๋ค.
1
int compare(T o1, T o2);
Arrays.sort()
๋ ๋ด๋ถ์ ์ผ๋ก Tim sort ๋ฅผ ์ฌ์ฉํ๋ค. Tim sort ๋ ๋ณํฉ์ ๋ ฌ์ ๊ธฐ๋ฐ์ผ๋ก ์งํํ๋, ์ผ์ ํฌ๊ธฐ ์ดํ์ ๋ถ๋ถ ๋ฆฌ์คํธ์ ๋ํด์๋ ์ฝ์
์ ๋ ฌ์ ์ํํ๋ ๋ฐฉ์์ด๋ค.
๋ณํฉ ์ ๋ ฌ์ ๋น ๋ฅธ ์๊ฐ ๋ณต์ก๋์ ์ฝ์
์ ๋ ฌ์ ๋ฉ๋ชจ๋ฆฌ ์ ๊ทผ ํจ์จ์ฑ์ ๊ณ ๋ คํ ๋ฐฉ์์ด๋ค. (์ฝ์
์ ๋ ฌ์ ๊ฒฝ์ฐ ์ธ์ ํ ๋ฉ๋ชจ๋ฆฌ์์ ๋น๊ต๋ฅผ ๋ฐ๋ณตํ๋ ๋ฐฉ์์ผ๋ก ์งํ๋๊ธฐ ๋๋ฌธ์ ์ฐธ์กฐ ์ง์ญ์ฑ์ ์ ๋ง์กฑํ๋ค.)
๋๋ฒ์งธ ์ธ์๋ก ์ ๋ฌ๋ Comparator
๊ตฌํ์ฒด๋ ์ฝ์
์ ๋ ฌ ๋ด๋ถ์์ ๋ ๊ฐ์ ๋น๊ต์ ์ฌ์ฉ๋๋ค.
์ฆ, compare() ๋ฉ์๋๋ฅผ ํตํด ๋ ๊ฐ์ ๋น๊ตํ ๋, ์์์ ์ ๋ฌํ o1.compareTo(o2)
๋ก ๋น๊ตํ ๊ฒ์ธ์ง, o1.charAt(n) - o2.charAt(n)
๋ฐฉ์์ผ๋ก ๋น๊ตํ ๊ฒ์ธ์ง๊ฐ ์ ํด์ง๋ค๊ณ ๋ณด๋ฉด๋๋ค.
1
2
3
4
5
6
7
8
// TimSort.sort() ๋ด๋ถ
...
if(nRemaining<MIN_MERGE) {
int initRunLen = countRunAndMakeAscending(a, lo, hi, c);
binarySort(a, lo, hi, lo +initRunLen, c);
return;
}
TimSort ์ countRunAndMakeAscending ๋ฉ์๋
TimSort.sort() ์ ๋ด๋ถ์ ์์ ๊ฐ์ ์ฝ๋๊ฐ ์๋๋ฐ, countRunAndMakeAscending
๋ฉ์๋๋ ์ด๋ฆ ๊ทธ๋๋ก โsort ์์
ํด์ผ ํ ๊ธธ์ด๋ฅผ ๋ฐํํ๋ ์ค๋ฆ์ฐจ์ ์ ์ด๊ธฐโ ๋ผ๊ณ ๋ณด๋ฉด ๋๋ค.
Arrays.sort() ๋ด๋ถ์์ ํด๋น ๋ฉ์๋๊ฐ ํญ์ ํธ์ถ๋๊ณ ์๊ธฐ ๋๋ฌธ์ ๊ธฐ๋ณธ๊ฐ์ด ์ค๋ฆ์ฐจ์์ผ๋ก ์ ์ง๋๋ค๋ ๊ฒ์ ์ ์ ์๋ค.
lo
๋ 0 ์ฆ, ์ฒซ๋ฒ์งธ ์ธ๋ฑ์ค๋ฅผ ์๋ฏธํ๊ณ hi
๋ ์ ๋ฌ๋ ๋ฐฐ์ด์ ์ ์ฒด ๊ธธ์ด๋ฅผ ์๋ฏธํ๋ค.
๊ทธ๋ฌ๋ฉด runHi
๋ณ์ ์ด๊ธฐ๊ฐ์ 1์ด๋๋ค.
1
if (c.compare(a[runHi++], a[lo]) < 0)
๋ฐ๋ผ์ ์ด ๋ถ๋ถ์์ ์ต์ด a[1]
, a[0]
์ ๋น๊ตํ๊ฒ ๋๋ค. ์ฆ, a[1]
๊ณผ a[0]
์ด o1.compareTo(o2)
๋๋ o1.charAt(n) - o2.charAt(n)
ํํ์์ ์ํด ํ๊ฐ๋๋ค. ๊ทธ๋ฆฌ๊ณ ๊ทธ ์ฐ์ฐ์ ๊ฒฐ๊ณผ๊ฐ ์์์ธ์ง๋ฅผ ํ์ธํ๊ณ ์๋ค.
๋ง์ฝ a[1]
, a[0]
์ ๊ฐ๊ฐ โaโ ๊ณผ โbโ ๋ผ๊ณ ํ๋ฉด, a[1] - a[0]
๋ ์์๊ฐ ๋์จ๋ค. (a = 97, b = 98)
(์ ๋์ ์๋ก ๋นผ๋์ง๋ String ์ compare ์ฌ์ ์ ์ต์ข
๊ฒฐ๊ณผ๋ฅผ ๋ณด๋ฉด ์ ์ ์๋ค.)
๋ฐ๋ผ์ ํด๋น ๊ฒฝ์ฐ๋ ๋ด๋ฆผ์ฐจ์์ ํด๋น๋๋ค. runHi
๋ฅผ 1์ฉ ์ฆ๊ฐํด ๊ฐ๋ฉด์, ์ค๋ฆ์ฐจ์ ์์ญ์ด ๋์ฌ๋ ๊น์ง ํ์ธํ๋ค.
๊ทธ๋ฌ๋ฉด ์ต์ข
๋ค์ง์ด์ผ ํ๋ ๊ฐฏ์(runHi)๊ฐ ์ ํด์ง๊ณ reverseRange
๋ฉ์๋๋ฅผ ํตํด ๋ด๋ฆผ์ฐจ์์ ํด๋น๋๋ ๋ถ๋ถ ๋ฐฐ์ด์ ์ค๋ฆ์ฐจ์์ผ๋ก ๋ค์ง๋๋ค.
๋ฐ๋๋ก ์ค๋ฆ์ฐจ์์ ๊ฒฝ์ฐ์๋ ๋ง์ฐฌ๊ฐ์ง์ ๋ฐฉ์์ผ๋ก runHi
๋ฅผ ์นด์ดํ
ํ๊ณ ์ด ๊ฐฏ์๋ฅผ ๋ฐํํ๋ค. ์ด ๊ณผ์ ์ ์ฝ์
์ ๋ ฌ ์ ์ ๋ฐฐ์ด์ ์ค๋ฆ์ฐจ์์ผ๋ก ์ธํ
ํ๋ ์ ์ฒ๋ฆฌ ํ๋ ๊ณผ์ ์ด๋ผ๊ณ ๋ณด๋ฉด ๋ ๊ฒ ๊ฐ๋ค.
๊ทธ ์ดํ ์ค์ ๋ก ์ ๋ ฌํ๋ ์์
์ binarySort()
์์ ์งํ๋๋ค.
Tim sort ๋ด๋ถ insertion sort ์ค
์ ๋ฆฌ
Arrays.sort() ์์ Comparator ๋ก ์ ๋ ฌํ๊ณ ์ ํ ๋
o1.compareTo(o2)
, o1.charAt(n) - o2.charAt(n)
: ์ค๋ฆ์ฐจ์ ์ ๋ ฌ
o2.compareTo(o1)
, o2.charAt(n) - o1.charAt(n)
: ๋ด๋ฆผ์ฐจ์ ์ ๋ ฌ
๋ก ๊ธฐ์ตํ๋ฉด ๋๋ค.
๋๊ธ๋จ๊ธฐ๊ธฐ