중복 처리
- 해시셋
- HashSet.contains() 속도 : O(1)
- HashSet.add() 속도 : O(1)
사전 순서 정렬
- 키 값을 이용한 정렬
- Collections.sort() - List 자료구조 사용 (편-안한 키 추가)
키 값 관리
- 사전 순서 정렬 후 해시맵 탐색을 위해 키 값을 따로 관리합니다.
Cnt 클래스 구현
- 나타난 횟수
를 멤버 변수로 갖는 클래스입니다. 해시맵에 키 값과 함께 들어가며, 기본 값은 1입니다.
HashSet은 어차피 중복 값을 허용하지 않지만, 중복값이 입력될 시 다른 작업을 하기 위해
HashSet의 contains를 활용합니다.
중복이면 HashMap에서 해당 key값으로 찾아들어가서
value로 지정된 Cnt 클래스를 가져와 멤버 변수 값을 1 증가시킵니다.
keySet / HashSet / HashMap<String, Cnt>에 모두 추가해줘야 합니다.
입력이 끝난 후, keySet을 정렬해줍니다. (기본 사전순 정렬이므로 그냥 넣기만 하면 됩니다.)
이후 이터레이터를 활용하여 keySet을 돌며 해당 키 값에 해당하는 Cnt 클래스를 불러와
백분율과 반올림 작업을 해주면 끝.
import java.io.BufferedReader;
import java.io.BufferedWriter;
import java.io.IOException;
import java.io.InputStreamReader;
import java.io.OutputStreamWriter;
import java.text.DecimalFormat;
import java.util.Collections;
import java.util.HashMap;
import java.util.HashSet;
import java.util.Iterator;
import java.util.LinkedList;
import java.util.List;
public class P4358 {
static class Cnt {
public int cnt = 1;
public Cnt() {
}
int getCnt() {
return this.cnt;
}
}
public static void main(String[] args) throws IOException {
BufferedReader bfr = new BufferedReader(new InputStreamReader(System.in));
BufferedWriter bfw = new BufferedWriter(new OutputStreamWriter(System.out));
String key = null;
HashSet<String> hSet = new HashSet<String>();
HashMap<String, Cnt> hMap = new HashMap<>();
List<String> keySet = new LinkedList<>();
int total = 0;
while (true) {
key = bfr.readLine();
if (key == null || key.length() == 0)
break;
total++;
if (hSet.contains(key))
hMap.get(key).cnt++;
else {
hSet.add(key);
hMap.put(key, new Cnt());
keySet.add(key);
}
key = null;
}
Collections.sort(keySet);
Iterator<String> it = keySet.iterator();
DecimalFormat df = new DecimalFormat("0.0000");
while (it.hasNext()) {
String hMapKey = it.next();
bfw.write(hMapKey);
bfw.write(" ");
bfw.write(df.format(hMap.get(hMapKey).cnt / (double) total * 100));
bfw.write("\n");
}
bfw.flush();
bfw.close();
bfr.close();
}
}