ABOUT ME

-

Today
-
Yesterday
-
Total
-
  • 프로그래머스 - Lv1. 실패율
    PS 2022. 2. 25. 14:36

    문제 : 실패율

    • 문제 링크는 여기.
    • 쉽게 말해, 1 ~ N라운드까지의 라운드별 실패율(=도달한 사람/(도달한 사람 + 통과한 사람))을 구해서 내림차순 정렬하고 배열로 반환해라.

    풀이

    import java.util.ArrayList;
    import java.util.Comparator;
    import java.util.HashMap;
    import java.util.List;
    import java.util.Map;
    
    class Solution {
        public int[] solution(int N, int[] stages) {
            HashMap<Integer, Integer> stagesMap = new HashMap<Integer, Integer>(); // 라운드별 진행유저 수 
            for (int roundUserCount : stages) {
                int putValue = (stagesMap.get(roundUserCount) == null) ? 1 : (stagesMap.get(roundUserCount) + 1);
                stagesMap.put(roundUserCount, putValue);
            }
    
            HashMap<Integer, Float> resultMap = new HashMap<Integer, Float>(); // 라운드별 실패율 
            int preRoundUsers = 0;
            int totalUsers = stages.length;
            float failRate = 0F;
            for (int i = 1; i <= N; i += 1) {
                totalUsers -= preRoundUsers;
                if (totalUsers == 0) {
                    resultMap.put(i, 0F);
                }
                else {                
                    int nowUser = stagesMap.get(i) == null ? 0 : stagesMap.get(i);
                    failRate = (float)nowUser / totalUsers;
                    resultMap.put(i, failRate);
    
                    preRoundUsers = nowUser;
                }
            }
    
            // 맵에 저장된 라운드별 실패율을 정렬하여 List에 엔트리로 담음.
    //        List<Map.Entry<Integer, Float>> entries = resultMap.entrySet().stream().sorted(Map.Entry.comparingByValue(Comparator.reverseOrder())).collect(Collectors.toList());
            List<Map.Entry<Integer, Float>> entries = new ArrayList(resultMap.entrySet());
            entries.sort(Map.Entry.comparingByValue(Comparator.reverseOrder()));
    
            int[] answer = new int[entries.size()];
            int i = 0;
            for (Map.Entry<Integer, Float> e : entries) {
                answer[i] = e.getKey();
                i += 1;
            }
    
            return answer;
        }
    }
    • 구현 아이디어 자체는 어려울 게 없다, 문제가 원하는 대로 구해주는게 전부.

    후기

    1 ) 아이디어는 쉬웠는데 Map을 sorting하는 법을 몰라서 헤맸다. 구글링 해보니까 죄다 stream을 쓰라고 하는데, 뭔지도 모르는 걸 갖다가 해결만 하긴 싫어서... Comparator에 대해 공부가 필요하다고 느꼈다. 자바 허접. (쭈굴...)
    2 ) 다른 문제(문자열 압축)에서도 그런데, 오류를 발생시키는 엣지케이스를 고려하는게 좀 낯설다. 덜렁이라서 그런것 같다. 이 문제에서는 totalUsers == 0인 경우(아무도 라운드에 도달하지 못했을 경우)를 생각하지 못해서 수차례 에러를 냈다.

    댓글

Designed by Tistory.