이 문제를 보고 Collection Framework을 사용하기 좋은 문제라고 생각했다. 중복 -> Set, 고유 이름과 값 -> Map, 지저분한 text문 -> List가 떠올랐기 때문이다.
계획은 일단 List로 값을 받는다 그 다음 Set으로 중복을 없애고 정렬하여 List로 바꾼다. 이로써 두 List를 서로 비교할 수 있는 것이다. Map에서 중복이 있는(수가 많은) List만큼을 돌면서
.containsKey
Map의 이 메소드를 활용하여 평균을 구한다.
Set으로 중복을 없애고 정렬한 List인 sortedList만큼 순회하여 map의 값을 뽑아낸다. 여기서 나는 map만큼 순회해도 된다생각했지만 for each문에서는 힘듦을 깨닫고 이렇게 하였다(map은 한층 벗겨내기가 이것보다 까다롭다)
import java.util.*;
public class Main {
private static List<String> names = new ArrayList<>();
private static Set<String> arrSet = new HashSet<>();
public static void main(String[] args) {
Scanner sc = new Scanner(System.in);
while(sc.hasNextLine()) {
String name = sc.nextLine();
if(name.isEmpty()) {
break;
}
names.add(name);
}
sc.close();
avg();
}
private static void avg(){
// 중복 x, 정렬 된 list
arrSet.addAll(names);
List<String> sortedList = new ArrayList<>(arrSet);
Collections.sort(sortedList);
// 중복 횟수를 기록할 Map 생성
Map<String, Double> avgMap = new HashMap<>();
for(String name : names) {
if(avgMap.containsKey(name)) {
avgMap.put(name, avgMap.get(name) + (1.0 / names.size()));
} else {
avgMap.put(name, 1.0 / names.size());
}
}
for(String name : sortedList) {
double avg = avgMap.get(name);
System.out.printf("%s %.4f%n", name, avg*100);
}
}
}
'알고리즘' 카테고리의 다른 글
[이론 노트]단순조합과 단순재귀 (0) | 2023.06.19 |
---|---|
[알고리즘 문제 해결 전략] 20장 문자열 (0) | 2023.06.16 |
[알고리즘 문제해결 전략] 재귀함수 (1) | 2023.06.09 |
[Programmers] 카펫 (0) | 2023.06.07 |
[BOJ]14889 스타트와 링크 (0) | 2023.06.03 |