https://www.acmicpc.net/problem/20920
문제
입력
풀이과정
Arrays.sort를 사용하면 쉽게 풀이가 가능한 것 같다. 1, 2, 3번의 정렬 기준을 제시해주면 될 것 같다.
대신 사전 준비가 조금 필요한데, 단어들의 출현 빈도를 알고있어야한다. 이는 HashMap을 사용해주었다.
다음은 자바로 풀이한 제출 코드이다.
import java.io.BufferedReader;
import java.io.InputStreamReader;
import java.util.*;
public class Main{
public static void main(String[] args) throws Exception {
BufferedReader br = new BufferedReader(new InputStreamReader(System.in));
StringBuilder sb = new StringBuilder();
StringTokenizer st = new StringTokenizer(br.readLine(), " ");
int N = Integer.parseInt(st.nextToken()), M = Integer.parseInt(st.nextToken());
Map<String, Integer> map = new HashMap<>();
while( N-- > 0 ){
String word = br.readLine();
if( word.length() >= M ){
if(map.containsKey(word))
map.replace(word, map.get(word)+1);
else
map.put(word,1);
}
}
Node[] arr = new Node[map.size()];
int index = 0;
for( Map.Entry<String, Integer> entry : map.entrySet() )
arr[index++] = new Node(entry.getKey(), entry.getValue());
// 기준에 따른 정렬
Arrays.sort(arr, (a,b)->{
if( a.numOfAppear != b.numOfAppear )
return Integer.compare( b.numOfAppear, a.numOfAppear);
else if( a.word.length() != b.word.length())
return Integer.compare( b.word.length(), a.word.length());
else
return a.word.compareTo(b.word);
});
Arrays.stream(arr).forEach( node -> sb.append(node.word).append("\n"));
System.out.println(sb);
}
static class Node{
String word;
int numOfAppear;
Node(String word, int numOfAppear){
this.word = word;
this.numOfAppear = numOfAppear;
}
}
}