일상

[프로그래머스] Lv. 1 실패율 (자바/JAVA)

개와염소 2025. 12. 10. 15:50

 

프로그래머스 1레벨 코딩테스트 연습

2019 KAKAO BLIND RECRUITMENT

 

https://school.programmers.co.kr/learn/courses/30/lessons/42889

 

프로그래머스

SW개발자를 위한 평가, 교육의 Total Solution을 제공하는 개발자 성장을 위한 베이스캠프

programmers.co.kr

 

작성한 코드

import java.util.*;

class Solution {
    public int[] solution(int N, int[] stages) {
        TreeMap<Integer, Integer> hmStages = new TreeMap<>();
        HashMap<Integer, Double> answerMap = new HashMap<>();

        int stageCnt = 0;
        //실패율 = 해당 숫자의 개수 / (전체 - 그 숫자 미만인 수의 개수)
        
        for(int stage : stages)         //클리어하지 못한 플레이어의 수
            hmStages.put(stage, hmStages.getOrDefault(stage, 0) + 1);
        
        int players = stages.length;    //플레이어 수
        
        for(int i = 1 ; i <= N ; i++){
            int stay = hmStages.getOrDefault(i, 0);
            
            double failRate = 0.0;
            
            if(players > 0)
                failRate = (double) stay / players;
            
            answerMap.put(i, failRate); //스테이지 번호, 실패율
            
            players -= stay;            //다음 스테이지 플레이어 수 갱신
        }
        
        List<HashMap.Entry<Integer, Double>> answerList 
            = new ArrayList<>(answerMap.entrySet());
        
        //value 기준 내림차순, 동일하면 key 오름차순 정렬
        answerList.sort((e1, e2) -> {
            int comp = Double.compare(e2.getValue(), e1.getValue());
            if(comp == 0) return e1.getKey() - e2.getKey();     //value가 동일한 경우
            return comp;
        });
        
        //key를 int 배열에 넣음
        int[] answer = answerList.stream().mapToInt(HashMap.Entry::getKey).toArray();

        return answer;
    }
}

 

제출 결과

챗GPT가 알려준 코드

import java.util.*;

class Solution {
    static class Stage {
        int idx;        // 스테이지 번호 (1..N)
        int failNum;    // 해당 스테이지에 머무는 사람 수 (분자)
        int total;      // 해당 스테이지 이상 도전한 사람 수 (분모)

        Stage(int idx, int failNum, int total) {
            this.idx = idx;
            this.failNum = failNum;
            this.total = total;
        }
    }

    public int[] solution(int N, int[] stages) {
        int M = stages.length;

        // 1) 각 스테이지에 머무르는 사람 수 카운트 (크기 N+2: stage 값이 N+1일 수 있음)
        int[] cnt = new int[N + 2];
        for (int s : stages) {
            if (s <= N + 1 && s >= 1) cnt[s]++;
        }

        // 2) 실패율 계산: players = 현재 스테이지 이상 도전한 플레이어 수
        int players = M;
        Stage[] arr = new Stage[N];
        for (int i = 1; i <= N; i++) {
            int stay = cnt[i]; // i 스테이지에 머무르는 사람
            int total = players; // i 이상 도전한 사람 수

            arr[i - 1] = new Stage(i, stay, total);
            players -= stay; // 다음 스테이지의 도전자 수 갱신
        }

        // 3) 정렬: 실패율 내림차순, 실패율 같으면 스테이지 번호 오름차순
        //    분수 비교를 위해 cross-multiply 사용 (failA/totalA ? failB/totalB)
        Arrays.sort(arr, (a, b) -> {
            // a.failNum / a.total  vs  b.failNum / b.total
            // 비교: a.failNum * b.total  vs  b.failNum * a.total
            long lhs = (long) a.failNum * (long) b.total;
            long rhs = (long) b.failNum * (long) a.total;
            if (lhs != rhs) {
                return Long.compare(rhs, lhs); // 내림차순 (큰 값이 앞)
            }
            return Integer.compare(a.idx, b.idx); // 실패율 같으면 작은 스테이지 먼저
        });

        // 4) 결과 추출
        int[] answer = new int[N];
        for (int i = 0; i < N; i++) answer[i] = arr[i].idx;
        return answer;
    }
}

챗GPT 코드 제출 결과

 

챗GPT가 써준 코드한테 성능으로 밀렸습니다. 제가 쓴 코드에서 성능을 개선할 방법이 있거나 쉽게 표현할 수 있는 방법이 있다면 편하게 댓글 남겨주세요. 감사합니다.