문제 출처 : https://www.acmicpc.net/problem/1181
1181번: 단어 정렬
첫째 줄에 단어의 개수 N이 주어진다. (1 ≤ N ≤ 20,000) 둘째 줄부터 N개의 줄에 걸쳐 알파벳 소문자로 이루어진 단어가 한 줄에 하나씩 주어진다. 주어지는 문자열의 길이는 50을 넘지 않는다.
www.acmicpc.net
문제
설명
Comparator와 contains함수를 잘 활용해서 풀어야 하는 문제입니다.
인터넷의 다른 포스팅들도 대부분 풀이가 같은 걸로 보아, 이 풀이로 거의 정형화된 문제인 것 같습니다.
compare(o1, o2)와 o1.compareTo(o2)는 공통적으로 o1에서 o2를 빼는데, 오버라이딩을 통해 연산의 대상을 변경할 수 있습니다. 그리고 이 두 함수는 연산의 결과값이 양수일 때만 o1과 o2의 위치를 바꾼다는 사실을 잘 활용해서 풀면 됩니다. (o1이 더 작은 대상이고, o2가 더 큰 대상이라고 생각하면 편합니다!)
코드
import java.util.ArrayList;
import java.util.Arrays;
import java.util.Comparator;
import java.util.List;
import java.util.Scanner;
public class BOJ_1181 {
public static void main(String[] args) {
Scanner sc = new Scanner(System.in);
int num = sc.nextInt();
String[] arr = new String[num];
for (int i = 0; i < num; i++) {
arr[i]=sc.next();
}
sc.close();
//입력 완료
Arrays.sort(arr, new Comparator<String>() {
@Override
public int compare(String o1, String o2) {
if(o1.length()==o2.length())
return o1.compareTo(o2); //ex) am - at = 음수 -> 순서 바꾸지 않으므로 'am at' 순서 그대로 유지됨.(사전순 정렬)
else
return o1.length()-o2.length(); //길이 기준으로 오름차순 정렬
}
});
//정렬된 array 완성
//중복값 제외하고 차례대로 넣음
List<String> result = new ArrayList<>();
for(String str : arr) {
if(!result.contains(str))
result.add(str);
}
for(String s: result)
System.out.println(s);
}
}
'알고리즘 문제풀이 > 백준' 카테고리의 다른 글
[BOJ][JAVA] 10773 - 제로 (0) | 2021.09.22 |
---|---|
[BOJ][JAVA] 7568 - 덩치 (0) | 2021.09.21 |
[BOJ][JAVA] 9012 - 괄호 (0) | 2021.09.21 |
[BOJ][JAVA] 1120 - 문자열 (0) | 2021.09.18 |
[BOJ][JAVA] 2920 - 음계 (0) | 2021.09.18 |