참고
문제해설
문제 로직고민
NOTE
•
M 길이 이상의 단어들을 Map자료구조에 저장한다.
1.
자주 나오는 단어의 경우 Map의 value로 카운팅을 진행하며 체크한다.
2.
만약 value가 같다면 길이로 확인한다.
3.
길이 마저 같다면 기존의 String 정렬 방식으로 정렬한다.
작성코드
NOTE
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));
StringBuilder sb = new StringBuilder();
String[] s;
s = br.readLine().split(" ");
int N = Integer.parseInt(s[0]);
int M = Integer.parseInt(s[1]);
Map<String, Integer> map = new HashMap();
for(int i =0; i<N; i++){
String line = br.readLine();
if(line.length() >= M && map.containsKey(line)) map.put(line, map.get(line) + 1);
else if(line.length() >= M) map.put(line, 1);
}
List<Map.Entry<String,Integer>> list = new ArrayList(map.entrySet());
Collections.sort(list, (e1, e2) -> {
if(!e1.getValue().equals(e2.getValue())) return Integer.compare(e2.getValue(), e1.getValue());
else if(e1.getKey().length() != e2.getKey().length()) return Integer.compare(e2.getKey().length(), e1.getKey().length());
else return e1.getKey().compareTo(e2.getKey());
});
for(Map.Entry entry : list){
bw.write(entry.getKey().toString() + "\n");
}
bw.flush();
}
}
Java
복사
Map을 사용해서 3가지의 정렬 조건을 모두 사용한다.
다른사람 풀이
NOTE
class Main {
public static void main(String[] args) throws IOException {
BufferedReader br = new BufferedReader(new InputStreamReader(System.in));
StringBuilder sb = new StringBuilder();
TreeMap<String, Integer> map = new TreeMap<>((o1, o2) -> {
if (o1.length() != o2.length()) return -(o1.length() - o2.length());
else return o1.compareTo(o2);
});
StringTokenizer st = new StringTokenizer(br.readLine());
int N = Integer.parseInt(st.nextToken());
int M = Integer.parseInt(st.nextToken());
for (int i = 0; i < N; i++) {
String word = br.readLine();
if (word.length() < M) continue;
if (map.containsKey(word)) map.put(word, map.get(word) + 1);
else map.put(word, 0);
}
List<String> result = new ArrayList<>(map.keySet());
result.sort((o1, o2) -> -(map.get(o1) - map.get(o2)));
for (String s : result) sb.append(s).append("\n");
System.out.println(sb);
}
}
Java
복사
TreeMap을 사용해서 기본 정렬조건을 제시해주고, 이후에 따로 리스트변환 이후 값을 정렬해주었다. (정렬조건을 따로 계산했는데 왜 되는지는 잘 모르겠음)