Today
-
Yesterday
-
Total
-
  • 프로그래머스 : 실패율
    코딩테스트 문제 풀이/프로그래머스 2023. 11. 23. 00:09

    다른 사람 풀이 _ 프로그래머스 다른 사람 풀이 첫번째

    import java.util.ArrayList;
    import java.util.Collections;
    import java.util.List;
    
    class Solution {
        public int[] solution(int N, int[] lastStages) {
            int nPlayers = lastStages.length;
            int[] nStagePlayers = new int[N + 2];
            for (int stage : lastStages) {
                nStagePlayers[stage] += 1;
            }
    
            int remainingPlayers = nPlayers;
            List<Stage> stages = new ArrayList<>();
            for (int id = 1 ; id <= N; id++) {
                double failure = (double) nStagePlayers[id] / remainingPlayers;
                remainingPlayers -= nStagePlayers[id];
    
                Stage s = new Stage(id, failure);
                stages.add(s);
            }
            Collections.sort(stages, Collections.reverseOrder());
    
            int[] answer = new int[N];
            for (int i = 0; i < N; i++) {
                answer[i] = stages.get(i).id;
            }
            return answer;
        }
    
        class Stage implements Comparable<Stage> {
            public int id;
            public double failure;
    
            public Stage(int id_, double failure_) {
                id = id_;
                failure = failure_;
            }
    
            @Override
            public int compareTo(Stage o) {
                if (failure < o.failure ) {
                    return -1;
                }
                if (failure > o.failure ) {
                    return 1;
                }
                return 0;
            }
        }
    }

    클래스를 활용하여 풀이한 코드이다. 내일 분석해봐야지..!! 🤓

    내 코드

    import java.util.Arrays;
    class Solution {
        public int[] solution(int N, int[] stages) {
            int[] answer = new int[N];
            float[] arrFailPercent = new float[N + 1];
            float totUserCnt = stages.length;
            
            // 실패율 계산 1 _ 스테이지별 유저 몇명인지 셈
            for (int i = 0; i < totUserCnt; i++) {
                if (stages[i] == N + 1) continue;
                arrFailPercent[stages[i]]++;
            }
            
            // 실패율 계산 2 _ 스테이지별 실패율 계산
            for (int i = 1; i < arrFailPercent.length; i++) {
                float nowStageUsers = arrFailPercent[i];
                
                if (totUserCnt <= 0) arrFailPercent[i] = 0;
                else                 arrFailPercent[i] /= totUserCnt;
                
                totUserCnt -= nowStageUsers;
            }
            
            // 실패율 높은 순 출력
            float[] arrOrder = arrFailPercent.clone();
            Arrays.sort(arrOrder);
            int idx = 0;
            for (int i = arrOrder.length - 1; i >= 1; i--) {
                for (int j = 1; j < arrFailPercent.length; j++) {
                    if (arrOrder[i] == arrFailPercent[j]) {
                        answer[idx++] = j;
                        arrFailPercent[j] = -1;
                        break;
                    }
                }
            }
            
            return answer;
        }
    }

    소요 시간 : 32분 12초

    30분을 초과했다 ㅠㅠ 이번 문제는 조금 어려웠음.. 테스트 케이스 몇가지를 예상하지 못해서 30분 됐다고 알림 울렸을때 질문하기를 참조해서 알아낸 테스트 케이스로 해결한 문제이다.

    내가 놓친 부분은 0 이하의 수로 나눗셈을 하려고 할 때 Nan이 배열에 들어가는 것을 생각하지 못한 거였다. 😔

Designed by Tistory / Custom by 얼거스