๐ ๋ฌธ์ ๋งํฌ
๐ ๋ฌธ์ ํ์ด
Comparator ํน์ Comparable ์ธํฐํ์ด์ค๋ฅผ ํ์ฉํด ์กฐ๊ฑด์ ๋ง๊ฒ ์ ๋ ฌ์ ํด์ฃผ๋ฉด ๋๋ค.
ํ ๋ธ๋ก๊ฑฐ์ ์ฝ๋๊ฐ ์ดํด๊ฐ ์ ๋์ด์, ํด๋น ์ฝ๋๋ก ํ๋ฉฐ ์ดํด๋ฅผ ํ๋ค.
Key Point
๐ Comparator ํน์ Comparable ์ธํฐํ์ด์ค๋ฅผ ํ์ฉํ๋ค.
Java ์ฝ๋
import java.util.*;
class Solution {
public String[] solution(String[] files) {
// Comparator ์ธํฐํ์ด์ค๋ฅผ ํ์ฉํด ์กฐ๊ฑด์ ๋ง๊ฒ ์ ๋ ฌํ๋ค.
Arrays.sort(files, new Comparator<String>() {
@Override
public int compare(String s1, String s2) {
String[] file1 = fileInfo(s1);
String[] file2 = fileInfo(s2);
int headValue = file1[0].compareTo(file2[0]);
if (headValue == 0) {
int num1 = Integer.parseInt(file1[1]);
int num2 = Integer.parseInt(file2[1]);
return num1 - num2;
}
else {
return headValue;
}
}
// head, number, tail ์ ๋ณด๋ฅผ ๋ด์ ๋ฐฐ์ด์ ๋ฆฌํดํ๋ ํจ์์ด๋ค.
private String[] fileInfo(String s) {
String head = "";
String number = "";
String tail = "";
int idx = 0;
for ( ; idx<s.length(); idx++) {
char ch = s.charAt(idx);
if (ch>='0' && ch<='9') break;
head += ch;
}
for ( ; idx<s.length(); idx++) {
char ch = s.charAt(idx);
if (!(ch>='0' && ch<='9')) break;
number += ch;
}
for ( ; idx<s.length(); idx++) {
char ch = s.charAt(idx);
tail += ch;
}
String[] file = {head.toLowerCase(), number, tail};
return file;
}
});
return files;
}
}
๐ก Comparable๊ณผ Comparator
๊ฐ์ฒด๋ฅผ ์ ๋ ฌํด์ฃผ๋ ์ธํฐํ์ด์ค์ด๋ค.
์ฆ, Comparable ํน์ Comparator๋ฅผ ์ฌ์ฉํ๊ณ ์ ํ๋ค๋ฉด ์ธํฐํ์ด์ค ๋ด์ ์ ์ธ๋ ๋ฉ์๋๋ฅผ ๋ฐ๋์ ๊ตฌํํด์ผ ํ๋ค.
Comparable ์ธํฐํ์ด์ค์๋ compareTo (T o) ๋ฉ์๋ ํ๋๊ฐ ์ ์ธ๋์ด์๋ค.
์ฆ, Comparable์ ์ฌ์ฉํ๊ณ ์ ํ๋ค๋ฉด compareTo ๋ฉ์๋๋ฅผ ์ฌ์ ์ (Override/๊ตฌํ) ํด์ฃผ์ด์ผ ํ๋ค.
โ ์๊ธฐ ์์ ๊ณผ ๋งค๊ฐ๋ณ์ ๊ฐ์ฒด๋ฅผ ๋น๊ตํ๋ค.
โ lang ํจํค์ง์ ์๊ธฐ ๋๋ฌธ์ import ํด์ค ํ์๊ฐ ์๋ค.
Comparator ์ธํฐํ์ด์ค์๋ ์ ์ธ๋ ๋ฉ์๋๊ฐ ๋ง์ง๋ง, ์ค์ง์ ์ผ๋ก ๊ตฌํํด์ผ ํ๋ ๋ฉ์๋๋ compare(T o1, T o2) ํ๋์ด๋ค.
โ ๋ ๋งค๊ฐ๋ณ์ ๊ฐ์ฒด๋ฅผ ๋น๊ตํ๋ค.
โ util ํจํค์ง์ ์๋ค.
๐ก ์ ๋ ฌ ์๊ณ ๋ฆฌ์ฆ
์ด๋ฒ ๋ฌธ์ ๋ ์ฝ๋ฉ์ ๊ธฐ์ด ๋ฌธ์ ์ธ ์ ๋ ฌ ๋ฌธ์ ์ด๋ค.
์ ๋ ฌ ๊ธฐ์ค์ ๋ฐ๋ผ ์ฐจ์ด๊ฐ ์๋ค๋ฉด ์๋ ์ ๋ ฅ์์ ์ฃผ์ด์ง ์์๋ฅผ ์ ์งํ๋ ์์ ์ ๋ ฌ (Stable Sort)์ ์ฌ์ฉํ๋ค.
์ด๋ฒ ๋ฌธ์ ๋ฅผ ํ๋ฉด์ ์์ง๊น์ง ์ ๋ ฌ ์๊ณ ๋ฆฌ์ฆ์ ๋ํด ์๋ฒฝํ ์์งํ๊ณ ์์ง ๋ชปํ๋ค๋ ๊ฒ์ ๊นจ๋ฌ์๋ค.
์ ๋ ฌ ์๊ณ ๋ฆฌ์ฆ์ ๋ํด ์กฐ๋ง๊ฐ ๊ณต๋ถํด์ผ๊ฒ ๋ค !
+ ๋ค๋ฅธ ์ฌ๋์ ํ์ด
ํ๋ก๊ทธ๋๋จธ์ค์์ ๋ค๋ฅธ ์ฌ๋์ ํ์ด๋ฅผ ๋ณด๋, ์ ๊ท์์ ํ์ฉํด์ ํธ๋ ๋ฐฉ๋ฒ๋ ์์๋ค.
Java์์๋ ์ ๊ท์์ ํ์ฉํด ๋ฌธ์์ด ๊ฒ์ฆ ๋ฐ ํ์์ ๋๋ Pattern, Matcher ํด๋์ค๋ฅผ ์ ๊ณตํด์ค๋ค.
์๋กญ๊ฒ ์๊ฒ ๋ ๊ฒ์ Matcher์ find()์ group() ๋ฉ์๋์ด๋ค.
boolean find()
ํจํด์ด ์ผ์นํ๋ ๋ค์ ๋ฌธ์์ด์ ์ฐพ๊ณ , ๋ค์ ๋ฌธ์์ด์ด ์์ผ๋ฉด true๋ฅผ ๋ฐํํ๋ค.
String group()
๋งค์น์ ์ผ์นํ๋ ๋ฌธ์์ด์ ๋ฐํํ๋ค.
groupt(int i)๋ ๋งค์นญ ๋๋ ๋ฌธ์์ด ์ค i๋ฒ์งธ ๊ทธ๋ฃน์ ๋ฌธ์์ด์ ๋ฐํํ๋ค.
0์ ๊ทธ๋ฃน์ ์ ์ฒด ํจํด์ ์๋ฏธํ๋ค.
- group(0) = group()
์๋๋ ์ ๊ท์์ ํ์ฉํ ํ์ด ์ค ๊น๋ํ๋ค๊ณ ์๊ฐํ๋ Java ์ฝ๋์ด๋ค.
import java.util.*;
import java.util.regex.*;
class Solution {
public String[] solution(String[] files) {
Pattern p = Pattern.compile("([a-z\\s.-]+)([0-9]{1,5})");
Arrays.sort(files, new Comparator<String>() {
@Override
public int compare(String s1, String s2) {
Matcher m1 = p.matcher(s1.toLowerCase());
Matcher m2 = p.matcher(s2.toLowerCase());
m1.find();
m2.find();
if(!m1.group(1).equals(m2.group(1))) {
return m1.group(1).compareTo(m2.group(1));
} else {
return Integer.parseInt(m1.group(2)) - Integer.parseInt(m2.group(2));
}
}
});
return files;
}
}
+ ๋น์ทํ ์ ํ์ ๋ ์ฌ์ด ๋ฌธ์
๐ ๋ฌธ์ ๋งํฌ : ๋ฌธ์์ด ๋ด ๋ง์๋๋ก ์ ๋ ฌํ๊ธฐ
compareTo ๋ฉ์๋๋ ์๊ณ ๋ฆฌ์ฆ์ ํ๋ฉด์ ๋ช ๋ฒ ์ฌ์ฉํ ์ ์ด ์์ง๋ง Comparable๊ณผ Comparator ์ธํฐํ์ด์ค๋ ์ฒ์ ์ ํด๋ณด์๋ค ,, ์๋๋ฉด ๊น๋จน์๊ฑฐ๋ ,,^^ ์ธํฐํ์ด์ค ์ฌ์ฉ๋ฒ์ ๊ฒ์ํ๋ค๊ฐ ์ฐ์ฐํ "๋ฌธ์์ด ๋ด ๋ง์๋๋ก ์ ๋ ฌํ๊ธฐ" ๋ฌธ์ ๋ฅผ ๋ง๋ฌ๋ค. ๋ฌธ์ ๊ฐ ํจ์ฌ ์ง๊ด์ ์ด์ด์ ์ด ๋ฌธ์ ๋ฅผ ๋จผ์ ํ๊ณ ๋๋ Java์์์ ๊ฐ์ฒด ์ ๋ ฌ์ ์ดํดํ๋๋ฐ ๋์์ด ๋์๋ค.
Java ์ฝ๋
import java.util.*;
class Solution {
public String[] solution(String[] strings, int n) {
Arrays.sort(strings, new Comparator<String>() {
// ์์ ๊ฐ(o1)๊ณผ ๋ค์ ๊ฐ(o2)์ ๋น๊ตํด์ ๋ฆฌํด๊ฐ์ ์์๋ก ์ฃผ๋ฉด ๊ฐ์ ๋ฐ๊พผ๋ค. (์ค๋ฆ์ฐจ์)
// ์์ ๊ฐ(o1)๊ณผ ๋ค์ ๊ฐ(o2)์ ๋น๊ตํด์ ๋ฆฌํด๊ฐ์ ์์๋ก ์ฃผ๋ฉด ๊ฐ์ ๋ฐ๊พธ์ง ์๋๋ค. (๋ด๋ฆผ์ฐจ์)
@Override
public int compare(String o1, String o2) {
if (o1.charAt(n) > o2.charAt(n)) {
return 1;
}
else if (o1.charAt(n) == o2.charAt(n)) {
// compareTo() ํจ์๋ ๋ ๊ฐ์ ๊ฐ์ ๋น๊ตํ์ฌ int ๊ฐ์ผ๋ก ๋ฐํํด์ค๋ค.
return o1.compareTo(o2);
}
else {
return -1;
}
}
});
return strings;
}
}
Reference
์๋ฐ [JAVA] - Comparable ๊ณผ Comparator์ ์ดํด
์๋ง ์ด ๊ธ์ ์ฐพ์ ์ค์ ๋ถ๋ค ๋๊ฐ๋ Comparable๊ณผ Comparator์ ์ฐจ์ด๊ฐ ๋ฌด์์ธ์ง ๋ชจ๋ฅด๊ฑฐ๋ ๊ถ๊ธํด์ ์ฐพ์์ค์ จ์ ๊ฒ์ด๋ค. ์ฌ์ค ์๊ณ ๋ณด๋ฉด ๋ ๊ฐ๋ ๊ทธ๋ ๊ฒ ์ด๋ ต์ง ์์ผ๋ ์๋ฌด๋๋ ์๋ฐ๋ฅผ ํ์ตํ๋ฉด์ ๊ฐ
st-lab.tistory.com
[ํ๋ก๊ทธ๋๋จธ์ค] ํ์ผ๋ช ์ ๋ ฌ (Java)
ํ๋ก๊ทธ๋๋จธ์ค ํ์ผ๋ช ์ ๋ ฌ์ง๋ฌธ์์ ์๊ตฌํ๋ ์ ๋ ฌ ๊ธฐ์ค์ ๋ฐ๋ผ์ ์ ๋ ฌ์ ํด์ฃผ๋ฉด ๋๋ ๋ฌธ์ ๋ค. Java์ ๊ฒฝ์ฐ์๋ Comparator๋ฅผ ์์ฌ์ฉํ ์ค ์์์ผ ํ ์ ์๋ ๋ฌธ์ ์๋ค.์ฃผ์ด์ง ํ์ผ๋ช ์ HEAD, NUMBER, TAI
velog.io
'Algorithms > programmers' ์นดํ ๊ณ ๋ฆฌ์ ๋ค๋ฅธ ๊ธ
Programmers, ์ง์ง์ด ์ ๊ฑฐํ๊ธฐ : Java (0) | 2022.12.18 |
---|---|
Programmers, ๊ธธ ์ฐพ๊ธฐ ๊ฒ์ : Java (0) | 2022.12.15 |
Programmers, [3์ฐจ] N์ง์ ๊ฒ์ : Java (3) | 2022.12.12 |
Programmers, ์คํจ์จ : Java (1) | 2022.12.10 |
Programmers, [3์ฐจ] ๋ฐฉ๊ธ๊ทธ๊ณก : Java (0) | 2022.12.08 |