알고리즘/test
javascript) 프로그래머스 - 실패율
이경찬 :)
2023. 2. 20. 13:23
https://school.programmers.co.kr/learn/courses/30/lessons/42889
프로그래머스
코드 중심의 개발자 채용. 스택 기반의 포지션 매칭. 프로그래머스의 개발자 맞춤형 프로필을 등록하고, 나와 기술 궁합이 잘 맞는 기업들을 매칭 받으세요.
programmers.co.kr
실행코드
function solution(N, stages) {
var clearRate = [];
var cnt = 0;
var allcnt = 0;
for(let i = 1; i < N + 1; i++){
for(let j = 0;j < stages.length; j++){
if(stages[j] >= i){
allcnt += 1;
}
if(stages[j] === i){
cnt += 1;
}
}
clearRate.push(cnt / allcnt)
cnt = 0;
allcnt = 0;
}
const sortedArr = clearRate
.map((value, index) => [value, index+1])
.sort((a,b) => b[0] - a[0]);
const resultArr = sortedArr
.map(pair => pair[1]);
return resultArr;
}
풀이
먼저 for문으로 i를 stage라고 생각하고 allcnt(전체에서 해당스테이지 이상.즉 분모)와 cnt(해당 stage를 아직 clear하지못한 인원 cnt)를 구해서 clearRate에 push해주었습니다.
이제 clearRate에는 실패율이 소수형태로 저장되어있습니다.
value와 index+1(stage는 1부터라서)로 나누어서 map과 sort를 진행을 하였습니다
그리고 sort해준 sortedArr를 가지고 index만으로 정렬을 해주어야 하니까 map을 이용해 1번쨰요소인 index로 새로운 resultArr를 만들어 return해주었습니다.
더 개선된 풀이
function solution(N, stages) {
const clearRate = new Array(N).fill(0);
let allcnt = stages.length;
stages.forEach(stage => {
if (stage <= N) {
clearRate[stage - 1]++;
}
});
clearRate.forEach((count, index) => {
const failureRate = count / allcnt;
clearRate[index] = [failureRate, index + 1];
allcnt -= count;
});
clearRate.sort((a, b) => b[0] - a[0]);
return clearRate.map(pair => pair[1]);
}
1. 각 단계에 대해 stages배열을 반복하는 대신 배열을 사용하여 각 단계를 클리어한 플레이어 수를 추적하여 코드를 더 효율적으로 만들어 줬습니다.
2. 또한 일부 불필요한 변수와 루프를 제거하여 코드를 단순화 해줬습니다.
3. 이 코드는 'clearRate' 배열에 대해 0 기반 인덱스를 사용한 다음 최종 결과 배열의 각 인덱스에 1을 추가합니다. 코드 전체에서 1부터 시작하는 인덱스를 사용하려면 그에따라 코드를 조정하면 됩니다.