๋ณธ๋ฌธ ๋ฐ”๋กœ๊ฐ€๊ธฐ
  • ์žฅ์›์ต ๊ธฐ์ˆ ๋ธ”๋กœ๊ทธ
๐Ÿ’ป Computer Science/- Data Structure, Algorithm

[์•Œ๊ณ ๋ฆฌ์ฆ˜ ๋ฌธ์ œ ํ’€์ด ์Šคํ‚ฌ] ์ž๋ฐ” ์—์„œ Comparator, Comparable ๋กœ ์ •๋ ฌ ๊ธฐ์ค€ ๋ฐ”๊พธ๊ธฐ (๋žŒ๋‹ค๋ฅผ ์ด์šฉํ•ด์„œ ๊น”๋”ํ•˜๊ฒŒ ์žฌ์ •์˜ํ•˜๊ธฐ)

by Wonit 2020. 2. 24.

Java์—์„œ comparable๋กœ ์ •๋ ฌ ๊ธฐ์ค€ ๋ฐ”๊พธ๊ธฐ

 

[Java ์‹ฌํ™”] Java ์—์„œ Comparable๋กœ ์ •๋ ฌ ๊ธฐ์ค€ ๋ฐ”๊พธ๊ธฐ.

Java์—์„œ comparator๋กœ ์ •๋ ฌ ๊ธฐ์ค€ ๋ฐ”๊พธ๊ธฐ ์ž๋ฐ”๋กœ ์•Œ๊ณ ๋ฆฌ์ฆ˜ ๋ฌธ์ œํ’€์ด๋ฅผ ํ•˜๋‹ค ๋ณด๋ฉด ํŠน์ • ์กฐ๊ฑด์— ์˜ํ•œ ์ •๋ ฌ์„ ์ˆ˜ํ–‰ํ•  ๋•Œ๊ฐ€ ์žˆ๋‹ค. ๊ธฐ๋ณธ์ ์œผ๋กœ ์ž๋ฐ”์—์„œ๋Š” ์ •๋ ฌ์„ ์œ„ํ•ด์„œ Arrays.sort() ์˜ static ๋ฉ”์„œ๋“œ๋‚˜ , Col

wonit.tistory.com


 

์ž๋ฐ”๋กœ ์•Œ๊ณ ๋ฆฌ์ฆ˜ ๋ฌธ์ œํ’€์ด๋ฅผ ํ•˜๋‹ค ๋ณด๋ฉด ํŠน์ • ์กฐ๊ฑด์— ์˜ํ•œ ์ •๋ ฌ์„ ์ˆ˜ํ–‰ํ•  ๋•Œ๊ฐ€ ์žˆ๋‹ค.

 

๊ธฐ๋ณธ์ ์œผ๋กœ ์ž๋ฐ”์—์„œ๋Š” ์ •๋ ฌ์„ ์œ„ํ•ด์„œ Arrays.sort() ์˜ static ๋ฉ”์„œ๋“œ๋‚˜ ,Collections.sort()์˜ static ๋ฉ”์„œ๋“œ๋ฅผ ์ œ๊ณตํ•˜์ง€๋งŒ, ์ด๋Š” ๊ธฐ๋ณธ ์ •๋ ฌ์ธ ์˜ค๋ฆ„์ฐจ์ˆœ ์ •๋ ฌ์„ ์ œ๊ณตํ•˜๊ธฐ ๋•Œ๋ฌธ์— ํŠน์ • ์กฐ๊ฑด์— ์˜ํ•œ ์ •๋ ฌ(๋‹ค์ฐจ์› ๋ฐฐ์—ด์˜ ์ •๋ ฌ, ๊ฐ์ฒด ์ •๋ ฌ, ์กฐ๊ฑด ์ •๋ ฌ)์„ ์ˆ˜ํ–‰ํ•˜๊ธฐ๋ž€ ๋ถˆ๊ฐ€๋Šฅํ•˜๋‹ค.

 

์ด ๋ถˆํŽธํ•จ์„ ํ•ด์†Œํ•ด๊ธฐ ์œ„ํ•ด ๋‘ ๊ฐ€์ง€์˜ ์กฐ๊ฑด ์ •๋ ฌ ๋ฐฉ์‹์ด ์กด์žฌํ•˜๋Š”๋ฐ ๋ฐ”๋กœ Comparator, Comparable ์ธํ„ฐํŽ˜์ด์Šค๋ฅผ ์ด์šฉํ•œ ์ •๋ ฌ ๋ฉ”์„œ๋“œ ์žฌ์ •์˜์ด๋‹ค.

 

ํ•˜์ง€๋งŒ ๋‘ ์ธํ„ฐํŽ˜์ด์Šค ๊ฐ„์˜ ์‚ฌ์šฉ ๋ชฉ์ ์— ๋”ฐ๋ฅธ ์ฐจ์ด๊ฐ€ ์กด์žฌํ•˜๊ธฐ ๋•Œ๋ฌธ์— ๊ทธ ์ฐจ์ด๋ถ€ํ„ฐ ๋ช…ํ™•ํ•˜๊ฒŒ ์งš๊ณ  ๋„˜์–ด๊ฐ€์ž.

 

Comparator vs Comparable

 

Comparable

comparable ์ธํ„ฐํŽ˜์ด์Šค๋ฅผ ์ด์šฉํ•œ ์ •๋ ฌ์€ ๋‹ค์Œ๊ณผ ๊ฐ™์€ ๋ชฉ์ ์ด ์žˆ์„ ๋•Œ ์‚ฌ์šฉํ•œ๋‹ค.

 

  • ๊ฐ์ฒด์˜ ํŠน์ • field๋ฅผ ์ด์šฉํ•œ ์˜ค๋ฆ„์ฐจ์ˆœ, ๋‚ด๋ฆผ์ฐจ์ˆœ ์ •๋ ฌ์„ ์›ํ•  ๊ฒฝ์šฐ
  • ๊ธฐ๋ณธ ์ •๋ ฌ ๊ธฐ์ค€ ์„ค์ •์˜ ๋ณ€๊ฒฝ์„ ์›ํ•  ๊ฒฝ์šฐ

Comparator

comparator ์ธํ„ฐํŽ˜์ด์Šค๋ฅผ ์ด์šฉํ•œ ์ •๋ ฌ์€ ๋‹ค์Œ๊ณผ ๊ฐ™์€ ๋ชฉ์ ์ด ์žˆ์„ ๋•Œ ์‚ฌ์šฉํ•œ๋‹ค.

 

  • ๊ฐ์ฒด์˜ ํŠน์ • field๋ฅผ ์ด์šฉํ•˜์—ฌ ํŠน์ • ๊ธฐ์ค€์œผ๋กœ ์ •๋ ฌ์„ ์›ํ•  ๊ฒฝ์šฐ
  • ๊ธฐ๋ณธ ์ •๋ ฌ ๊ธฐ์ค€(์˜ค๋ฆ„์ฐจ์ˆœ, ๋‚ด๋ฆผ์ฐจ์ˆœ)์˜ ๊ธฐ์ค€์ด ์•„๋‹Œ ๋‹ค๋ฅธ ๊ธฐ์ค€์œผ๋กœ ์ •๋ ฌ์„ ์›ํ•  ๊ฒฝ์šฐ

Comparator

 

comparator ๋˜ํ•œ comparable๊ณผ ๋งˆ์ฐฌ๊ฐ€์ง€๋กœ ์ •๋ ฌ ๊ธฐ์ค€์„ ๋‹ค๋ฅด๊ฒŒ ํ•˜๊ณ ์‹ถ์„ ๋•Œ ์‚ฌ์šฉํ•œ๋‹ค.

 

ํ•˜์ง€๋งŒ ์ฐจ์ด์ ์ด๋ผ๊ณ  ํ•˜๋ฉด comparabl์€ ์ •๋ ฌ ๊ธฐ์ค€์ด ์ผ๋ฐ˜์ ์ผ ๊ฒฝ์šฐ(๋‚ด๋ฆผ์ฐจ์ˆœ) ์ผ๋•Œ ์‚ฌ์šฉํ•˜์ง€๋งŒ comparator์€ ์ •๋ ฌ ๊ธฐ์ค€์ด ์ผ๋ฐ˜์ ์ด์ง€ ์•Š์„ ๋•Œ(๋ฌธ์ž์—ด์˜ ๊ธธ์ด๋ฅผ ๋น„๊ตํ•˜์—ฌ ์˜ค๋ฆ„์ฐจ์ˆœ, ๋‚ด๋ฆผ์ฐจ์ˆœ์œผ๋กœ ์ •์˜ํ•  ๋•Œ) ์‚ฌ์šฉํ•˜๋Š” ๊ฒฝ์šฐ๊ฐ€ ๋งŽ๋‹ค.

 

์ •๋ ฌ ๊ธฐ์ค€

 

์ฒซ ๋ฒˆ์จฐ ํŒŒ๋ผ๋ฏธํ„ฐ์˜ ๊ฐ’๊ณผ ๋‘ ๋ฒˆ์งธ ํŒŒ๋ผ๋ฏธํ„ฐ์˜ ๊ฐ’์„ ๋น„๊ตํ•˜์—ฌ -1, 0, 1์„ return ํ•˜์—ฌ ์ •๋ ฌํ•œ๋‹ค

 

๋ฅผ ํ’€์–ด์„œ ๋ณด์ž๋ฉด,

 

  • o1 < o2 ์ธ ๊ฒฝ์šฐ๋Š” ์Œ์ˆ˜๋ฅผ return
  • o1 = o2 ์ธ ๊ฒฝ์šฐ๋Š” 0 ์„ return
  • o1 > o2 ์ธ ๊ฒฝ์šฐ๋Š” ์–‘์ˆ˜๋ฅผ return

 

๋ฐ˜ํ™˜ ๊ฐ’์ด ์Œ์ˆ˜, 0 ์ด๋ฉด ๊ฐ์ฒด์˜ ์ž๋ฆฌ๋ฅผ ๋ณ€๊ฒฝํ•˜์ง€ ์•Š๊ณ  ์–‘์ˆ˜์ด๋ฉด ๊ฐ์ฒด์˜ ์ž๋ฆฌ๋ฅผ ๋ณ€๊ฒฝํ•œ๋‹ค.

 

ํด๋ž˜์Šค์—์„œ comparator ์ธํ„ฐํŽ˜์ด์Šค๋ฅผ implements ํ•˜๋Š” ๋ฐฉ๋ฒ•๋„ ์กด์žฌํ•˜์ง€๋งŒ comparetor์€ ์ต๋ช…ํ•จ์ˆ˜๋กœ ์ •์˜๋ฅผ ์ž์ฃผ ํ•œ๋‹ค.

 

์ด ์˜ˆ์ œ๋Š” ๋ฐ”๋กœ ๋ฌธ์ œ๋ฅผ ํ†ตํ•ด์„œ ์•Œ์•„๋ณด์ž

 

compare()

 

์œ„์˜ ์ •๋ ฌ ๊ธฐ์ค€์„ ๋ณด๋ฉด o1 < o2 ์ธ ๊ฒฝ์šฐ ์Œ์ˆ˜๋ฅผ return ํ•œ๋‹ค๊ณ  ๋˜์–ด์žˆ๋Š”๋ฐ, ์ด๋ฅผ ๋ฐ”๊ฟ”์„œ ์‚ฌ์šฉํ•˜๋ฉด o1 - o2 > 0 ๊ณผ ๊ฐ™๋‹ค.

 

ํ•˜์ง€๋งŒ ์ด์— ๋ฐ˜๋Œ€๋กœ ๋‚ด๋ฆผ ์ฐจ์ˆœ์œผ๋กœ ์ •๋ ฌ์„ ์›ํ•˜๋ฉด ๋‹น์—ฐํ•˜๊ฒŒ return ๊ฐ’์„ ๋ฐ˜๋Œ€๋กœ ๋„ฃ์–ด์ฃผ๋ฉด ๋œ๋‹ค.

 

 

๋žŒ๋‹ค๋ฅผ ์ด์šฉํ•˜์—ฌ ์•Œ๊ณ ๋ฆฌ์ฆ˜ ๋ฌธ์ œํ’€์ด์—์„œ ์šฐ์•„ํ•˜๊ฒŒ ์‚ฌ์šฉํ•˜๊ธฐ

 

์•Œ๊ณ ๋ฆฌ์ฆ˜ ๋ฌธ์ œํ’€์ด์—์„œ๋Š” ์—ฌ๋Ÿฌ ๋กœ์ง์ด ํ•จ๊ป˜ ๋“ฑ์žฅํ•˜๊ธฐ ๋•Œ๋ฌธ์— ๊ฐ€๋…์„ฑ์ด ์š”๊ตฌ๋œ๋‹ค.

 

๊ทธ๋ž˜์„œ ์œ„์˜ Comparator๊ณผ Comparable ์„ sort() ๋ฉ”์„œ๋“œ๊ฐ€ ํ˜ธ์ถœ๋  ๋•Œ ํŒŒ๋ผ๋ฏธํ„ฐ๋กœ ์ต๋ช…ํ•จ์ˆ˜๋ฅผ ๋„˜๊ธฐ๋Š” ์ฝ”๋“œ๋ฅผ ๋ด๋ณด์ž.

 

์˜ˆ๋ฅผ ๋“ค์–ด 2์ฐจ์› ๋ฐฐ์—ด์„ ์ •๋ ฌํ•œ๋‹ค๊ณ  ํ•ด๋ณด์ž.

 

int[][] arr = {
    {8, 14},
    {3, 5},
    {5, 20},
    {1, 16},
};

 

์ด๋ผ๋Š” ๋ฐฐ์—ด์ด ์žˆ๋‹ค๊ณ  ๊ฐ€์ •ํ–ˆ์„ ๋•Œ, ๋ฐฐ์—ด์˜ 2๋ฒˆ ์งธ ์›์†Œ๋ฅผ ๊ธฐ์ค€์œผ๋กœ ์ •๋ ฌ์„ ํ•œ๋‹ค๊ณ  ํ•˜๋ฉด, ๋‹ค์Œ๊ณผ ๊ฐ™์€ ์ฝ”๋“œ๊ฐ€ ๋‚˜์˜ฌ ์ˆ˜ ์žˆ๋‹ค

 

int[][] arr = {
    {8, 14},
    {3, 5},
    {5, 20},
    {1, 16},
};

Arrays.sort(arr, (a1, a2) -> a1[1] - a2[1]);

System.out.println(Arrays.deepToString(arr));

// [[3, 5], [8, 14], [1, 16], [5, 20]]

 

์ด ํ•œ ์ค„์—๋Š” ๋žŒ๋‹ค๋กœ ์“ฐ์—ฌ์ ธ ์žˆ์ง€๋งŒ ์ต๋ช… ํ•จ์ˆ˜๋ฅผ ํ’€์–ด์“ฐ์ž๋ฉด ๋‹ค์Œ๊ณผ ๊ฐ™๋‹ค.

 

int[][] arr = {
    {8, 14},
    {3, 5},
    {5, 20},
    {1, 16},
};

Arrays.sort(arr, new Comparator<int[]>() {
    @Override
    public int compare(int[] a1, int[] a2) {
        return a1[1] - a2[1];
    }
});

System.out.println(Arrays.deepToString(arr));

// [[3, 5], [8, 14], [1, 16], [5, 20]]

 

๊ณผ ๊ฐ™์€๋ฐ, ์ต๋ช… ํ•จ์ˆ˜ ๋ฅผ ๋˜ ์•ž์„œ ๋ฐฐ์šด ํ˜•ํƒœ๋กœ ํ’€์–ด์“ฐ์ž๋ฉด ๋‹ค์Œ๊ณผ ๊ฐ™๋‹ค.

 

int[][] arr = {
    {8, 14},
    {3, 5},
    {5, 20},
    {1, 16},
};

Comparator<int[]> comparator = new Comparator<int[]>() {
    @Override
    public int compare(int[] a1, int[] a2) {
    return a1[1] - a2[1];
    }
};

Arrays.sort(arr, comparator);

System.out.println(Arrays.deepToString(arr));

// [[3, 5], [8, 14], [1, 16], [5, 20]]

 

์ด๋ ‡๊ฒŒ ๋ณธ๋‹ค๋ฉด ๋ฌธ์ œ ํ’€์ด์—์„œ ํ•œ ์ค„๋กœ ์“ฐ๋Š” ๋žŒ๋‹ค์‹์ด ์–ผ๋งˆ๋‚˜ ํšจ์œจ์ ์ธ์ง€ ์•Œ ์ˆ˜ ์žˆ์„ ๊ฒƒ์ด๋‹ค.

 

์ด์™€ ๊ด€๋ จํ•œ ์•Œ๊ณ ๋ฆฌ์ฆ˜ ๋ฌธ์ œ๋กœ๋Š”

 

  1. ๋ฐฑ์ค€ 1263 ์‹œ๊ฐ„ ๊ด€๋ฆฌ ๋ฌธ์ œ ํ’€์ด
  2. ๋ฐฑ์ค€ 11651 ์ขŒํ‘œ ์ •๋ ฌํ•˜๊ธฐ 2 ๋ฌธ์ œ ํ’€์ด
  3. ๋ฐฑ์ค€ 10814 ๋‚˜์ด์ˆœ ์ •๋ ฌ ๋ฌธ์ œ ํ’€์ด
  4. ๋ฐฑ์ค€ 10825 ๊ตญ์˜์ˆ˜ ๋ฌธ์ œ ํ’€์ด

 

๊ฐ€ ์žˆ์œผ๋‹ˆ ์—ฐ์Šต ์‚ผ์•„ ํ’€์–ด๋ณด๋Š” ๊ฒƒ๋„ ์ข‹์€ ์„ ํƒ์ด๋‹ค.

๋Œ“๊ธ€