https://swexpertacademy.com/main/code/problem/problemDetail.do?contestProbId=AWqU0zh6rssDFARG
염라대왕은 이승의 사람들의 모든 이름을 가지고 있다.
어느 날 저승에 일어난 진도 8.0 지진에 항상 정리되어 있던 이승 명부가 흐트러졌다.
이승 명부는 이름의 길이가 짧을수록 이 앞에 있었고, 같은 길이면 사전 순으로 앞에 있었다.
이왕 이렇게 된 김에 모든 이름을 다시 정리하고 같은 이름은 하나만 남겨놓기로 한 염라대왕을 도와주자.
핵심
문제는 매우 단순하다. 우리가 원하는 조건으로 정렬을 하는 것이다.
정답 코드
import java.util.*;
import java.util.stream.Collectors;
class Solution {
public static void main(String args[]) throws Exception {
Scanner sc = new Scanner(System.in);
int T;
T=sc.nextInt();
StringBuilder sb = new StringBuilder();
for(int test_case = 1; test_case <= T; test_case++) {
int n = sc.nextInt();
List<String> str = new ArrayList<>();
for (int i = 0; i< n; i++){
str.add(sc.next());
}
List<String> list = str.stream().distinct().sorted(new Comparator<String>() {
@Override
public int compare(String o1, String o2) {
if (o1.length() == o2.length()) {
return o1.compareTo(o2);
} else {
if (o1.length() > o2.length()) return 1;
else return -1;
}
}
}).collect(Collectors.toList());
sb.append("#"+test_case+"\n");
for (String s : list) {
sb.append(s + "\n");
}
}
System.out.println(sb);
}
}
해설
문제의 요구 사항대로 글자가 짧은 순이며, 사전 순이고 중복을 제거해야 한다.
이는 스트림을 사용하여 간단하게 해결할 수 있다.
중복 제거의 경우 distinct를 사용하였다.
정렬 같은 경우 길이가 같으면 사전으로 배치하고,
길이가 다르면 길이가 짧은 것이 앞으로 가도록 compare를 오버라이딩하였다.
배운 점
문제가 단순하여 풀이법은 생각하기 쉽다.
compare를 재정의하는 방법 idle없이 사용할 수있도록 익혀두자.
'PS > 알고리즘 문제풀이' 카테고리의 다른 글
[백준] 2138번 전구와 스위치(java) (3) | 2023.02.02 |
---|---|
[SWEA] 13736번 사탕 분배 - 분할 정복(java) (0) | 2023.02.02 |
[백준] 11052번 카드 구매하기(java) (2) | 2023.01.31 |
[백준] 16948번 데스 나이트(java) (1) | 2023.01.30 |
[프로그래머스] 이중우선순위큐 (0) | 2023.01.29 |