https://www.acmicpc.net/problem/20920
20920번: 영단어 암기는 괴로워
첫째 줄에는 영어 지문에 나오는 단어의 개수 $N$과 외울 단어의 길이 기준이 되는 $M$이 공백으로 구분되어 주어진다. ($1 \leq N \leq 100\,000$, $1 \leq M \leq 10$) 둘째 줄부터 $N+1$번째 줄까지 외울 단
www.acmicpc.net
import java.util.*;
import java.io.*;
public class Solution
{
static HashMap<String, Integer> words;
public static void main(String args[]) throws Exception
{
BufferedReader br = new BufferedReader(new InputStreamReader(System.in));
StringTokenizer st;
BufferedWriter bw = new BufferedWriter(new OutputStreamWriter(System.out));
st = new StringTokenizer(br.readLine());
int N = Integer.parseInt(st.nextToken());
int M = Integer.parseInt(st.nextToken());
words = new HashMap<>();
for(int i=0;i<N;i++){
String tmp = br.readLine();
//M보다 짧으면 넘기기
if(tmp.length()<M) continue;
//hashmap에 있으면 value ++, 없으면 추가
if(words.containsKey(tmp)){
words.put(tmp,words.get(tmp)+1);
}
else {
words.put(tmp, 1);
}
}
//오름차순 정렬
List<Map.Entry<String,Integer>> list = new ArrayList<>(words.entrySet());
list.sort((o1,o2)->{
int cmp = o2.getValue()-o1.getValue();
if(cmp!=0) return cmp;
else{
//길이
int len = o2.getKey().length() - o1.getKey().length();
if(len!=0) return len;
else{
//사전순
int tmp = o1.getKey().compareTo(o2.getKey());
return tmp;
}
}
});
for(Map.Entry<String,Integer> s:list){
bw.append(s.getKey()).append("\n");
}
bw.flush();
bw.close();
}
}
시간초과로 많이 고생했는데 ,, 결국 bufferedwriter를 사용해서 해결하였다.
System.out.println의 경우 synchronized 블럭으로 감싸져있고 이로 인해 호출만으로도 오버헤드가 발생한다.
public void println(String x) {
synchronized (this) {
print(x); // 출력
newLine(); // 새로운 줄 생성
}
}
출력의 양이 많을 때에는 bufferedwriter를 사용하자 !
'알고리즘' 카테고리의 다른 글
[PGS] 프로그래머스 - 여행경로 (JAVA) (0) | 2024.04.18 |
---|---|
[프로그래머스] PGS - 게임 맵 최단거리 (0) | 2023.04.22 |
[PGS] 프로그래머스 - 아이템줍기 (JAVA) (0) | 2023.04.14 |
[백준] BOJ2608 - 로마 숫자 (JAVA) (0) | 2023.04.13 |
[백준] BOJ2992 - 크면서 작은 수 (JAVA) (0) | 2023.04.12 |