Publish:

ํƒœ๊ทธ: , , , , ,

์นดํ…Œ๊ณ ๋ฆฌ:

img_3.png

๋ฌธ์ œ

๋ฌธ์ œ ๋งํฌ

img_3.png

ํ’€์ด

์ฒซ๋ฒˆ์งธ ํ’€์ด (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;
}

img_4.png 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() ์—์„œ ์ง„ํ–‰๋œ๋‹ค.

img_4.png 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) : ๋‚ด๋ฆผ์ฐจ์ˆœ ์ •๋ ฌ

๋กœ ๊ธฐ์–ตํ•˜๋ฉด ๋œ๋‹ค.

๋ฐฉ๋ฌธํ•ด ์ฃผ์…”์„œ ๊ฐ์‚ฌํ•ฉ๋‹ˆ๋‹ค! ๋Œ“๊ธ€,์ง€์ ,ํ”ผ๋“œ๋ฐฑ ์–ธ์ œ๋‚˜ ํ™˜์˜ํ•ฉ๋‹ˆ๋‹ค๐Ÿ˜Š

๋Œ“๊ธ€๋‚จ๊ธฐ๊ธฐ