프로그래머스 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가 써준 코드한테 성능으로 밀렸습니다. 제가 쓴 코드에서 성능을 개선할 방법이 있거나 쉽게 표현할 수 있는 방법이 있다면 편하게 댓글 남겨주세요. 감사합니다.