본문 바로가기
알고리즘

[BOJ]4358 생태학

by 슈슈슉민 2023. 6. 9.

이 문제를 보고 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);
        }
	}

}