반응형
풀이
- 해당 문제는 다양한 방법이 있을 것 같은데
- 우선 아래의 풀이는 다음과 같음
- 입력으로 주어지는 단어를 확인 후 조건에 따라 분류하는데
- 우선 길이가 M이상의 경우를 체크한 뒤
- Map에 추가가 되어 있다면 카운팅을 1 증가 하고
- 없다면 초기화를 해주는데
- 초기화 할 때는, 출력 조건을 위한 정렬을 위해
- 현재 단어와, 카운팅 이렇게 두개의 값을 함께 초기화 해주기.
- 이후 Map의 value를 List로 변환하고, 조건에 따라 정렬해주고 출력하여 해결.
import java.io.*;
import java.util.*;
public class _20920 {
public static void main(String[] args) throws IOException {
BufferedReader br = new BufferedReader(new InputStreamReader(System.in));
BufferedWriter bw = new BufferedWriter(new OutputStreamWriter(System.out));
int[] NM = Arrays.stream(br.readLine().split(" ")).mapToInt(Integer::parseInt).toArray();
int N = NM[0]; // 총 단어
int M = NM[1]; // 기준 단어 길이
Map<String, Object[]> dic = new HashMap<>();
while (N>0) {
String cmd = br.readLine();
if (cmd.length()>=M) {
if (!dic.containsKey(cmd)) {
dic.put(cmd,new Object[]{cmd,1});
} else dic.get(cmd)[1] = (int)dic.get(cmd)[1]+1;
}
N--;
}
List<Object[]> result = new ArrayList<>(dic.values());
Collections.sort(result, new Comparator<Object[]>() {
public int compare(Object[] a, Object[] b) {
if ((int)a[1]!=(int)b[1]) return (int)b[1]-(int)a[1];
else {
String a0 = (String) a[0];
String b0 = (String) b[0];
if (a0.length()!=b0.length()) return b0.length()-a0.length();
else return a0.compareTo(b0);
}
}
});
for (Object[] x: result) bw.write(x[0]+"\n");
bw.flush();
}
}
'알고리즘' 카테고리의 다른 글
[백준, 자바, 14888번] 연산자 끼워넣기 (1) | 2024.11.20 |
---|---|
[백준, 자바, 24060번] 알고리즘 수업 - 병합 정렬 1 (0) | 2024.11.19 |
[백준, 자바, 2346번] 풍선 터뜨리기 (0) | 2024.11.14 |
[백준, 자바, 13909번] 창문 닫기 (0) | 2024.11.13 |
[백준, 자바, 17103번] 골드바흐 파티션 (0) | 2024.11.13 |