ETC/Algorithm
백준 1181 : 단어 정렬
안금장
2023. 9. 1. 17:37
문제
알파벳 소문자로 이루어진 N개의 단어가 들어오면 아래와 같은 조건에 따라 정렬하는 프로그램을 작성하시오.
- 길이가 짧은 것부터
- 길이가 같으면 사전 순으로
단, 중복된 단어는 하나만 남기고 제거해야 한다.
import java.util.Arrays;
import java.util.Comparator;
import java.util.HashSet;
import java.util.Scanner;
import java.util.Set;
public class Main {
public static void main(String[] args) {
Main main = new Main();
Scanner sc = new Scanner(System.in);
int length = sc.nextInt();
sc.nextLine();
String[] words = new String[length];
for (int i = 0; i < length; i++) {
words[i] = sc.nextLine();
}
String[] answer = main.solution(length, words);
for (String word : answer) {
System.out.println(word);
}
}
private String[] solution(int length, String[] words) {
Set<String> unique = new HashSet<>(Arrays.asList(words));
String[] answer = unique.toArray(new String[0]);
Arrays.sort(answer, new Comparator<String>() {
@Override
public int compare(String o1, String o2) {
if (o1.length() - o2.length() == 0) {
return o1.compareTo(o2); // java의 문자열 비교 방식이 사전식 비교 방식이기 때문
} else {
return o1.length() - o2.length();
}
}
});
return answer;
}
}
도저히 풀 방법이 생각나지 않아서 구글링 하였다.
코드가 깨끗해 보이지는 않지만,, 우선 Comparator에 대해서 알게 되었다.
Arrays.sort 메소드에서는 인자로 배열과 Comparator를 받는다.
Comparator는 interface인데 정렬에 많이 쓰인다고 한다.
두 가지 인자를 비교한다. 음의 정수, 0 혹은 양의 정수를 return 하는데
음의 정수 -> 첫 번째 인자가 더 작음
0 -> 두 인자가 같음
양의 정수 -> 두 번째 인자가 더 큼
Arrays.sort(answer, new Comparator<String>() {
@Override
public int compare(String o1, String o2) {
if (o1.length() - o2.length() == 0) {
return o1.compareTo(o2); // java의 문자열 비교 방식이 사전식 비교 방식이기 때문
} else {
return o1.length() - o2.length();
}
}
});
sort 함수 내부에서 Comparator의 compare 함수를 override 하여 비교 방식을 재정의 하였다.
o1과 o2의 길이가 같으면 compareTo 메소드를 이용하여 사전식 비교를 하며
길이가 다르다면 인자의 길이(length) 비교를 통해 두 인자를 비교한다.
private String[] solution(int length, String[] words) {
Set<String> unique = new HashSet<>(Arrays.asList(words));
String[] answer = unique.toArray(new String[0]);
Arrays.sort(answer, (o1, o2) -> {
if (o1.length() - o2.length() == 0) {
return o1.compareTo(o2); // java의 문자열 비교 방식이 사전식 비교 방식이기 때문
} else {
return o1.length() - o2.length();
}
});
return answer;
}
람다를 이용하여 위와 같이 코드를 바꿔줄 수도 있다.