오늘의 스터디 문제 목록
function failureRate(unpassed, arrive){ // 실패율 구하는 함수
return unpassed / arrive;
}
function solution(N, stages) {
// 실패율: 스테이지에 도달했으나 아직 클리어하지 못한 플레이어의 수 / 스테이지에 도달한 플레이어 수
// 스테이지에 도달했으나 아직 클리어하지 못한 플레이어 === stage <= 스테이지에 도달한 플레이어
// n을 돌면서 스테이지 filter로 stages 하나씩 돌아줌
// 돌면서 n(i)이랑 같으면 uppassed , 같거나 arrive임 그걸 변수에 넣어서
// 전체 스테이지(N)를 돌면서 filter로 stages의 요소도 하나씩 도는데 스테이지와 유저가 머문 스테이지가 같다면 unpassed, 유저가 머문 스테이지가 더 크거나 같으면 arrive
// filter로 걸러 준 다음에 length로 플레이어 수를 구함
// 실패율 구함
// 2차원 배열로 0번째는 스테이지 번호, 1번째는 실패율
let arr = [];
let unpassed = 0;
let arrive = 0;
for(let i = 1 ; i <= N ; i++){
let result = 0;
const unpassed = stages.filter(ele => { // 스테이지에 도달했으나 클리어하지 못한 플레이어 수
return ele === i;
}).length;
const arrive = stages.filter(ele => { // 스테이지에 도달한 플레이어 수
return ele >= i;
}).length;
result = failureRate(unpassed, arrive); // 실패율
arr.push([i, result]) // arr에 2차원 배열로 넣어줌
}
// 내림차순 정렬(b - a), 실패율은 1번 째 인덱스에 있으니까 정렬 기준으로 잡아 준다
arr.sort((a, b) => {
return b[1] - a[1]
});
// [i][0]만 뽑아오면 되므로 map 써서 배열 리턴
return arr.map(ele => ele[0]);
}
대부분 접근하는 방식은 비슷했으나 filter를 쓰지 않고 푼 방법 중에 효근님 코드가 좋았다!!
그리고 객체로 했을 때 sort 하는 방법까지도 ^ㅁ^
<효근님 코드>
// 순회하면서 해당 인덱스에 값이 있으면 +1
const sortStages = (N,stages) => {
const newArr = new Array(N+1).fill(0);
for(value of stages){
newArr[value-1] = newArr[value-1] + 1 ;
}
return newArr;
}
// 순회하면서 분자의 값은 인덱스에서 꺼내고
// 분모의 값은 이전 분자의 값들을 빼나감.
const getFailureRates = (sortedStages, people)=>{
let denominator = people;
let index = 1;
const newArr = [];
for(const num of sortedStages){
// 정렬해도 인덱스를 기억하기 위해 객체로 담았다.
const newObj = {
'index' : index,
'value' : num / denominator
};
newArr.push(newObj);
denominator = denominator - num;
index++;
}
// 마지막은 마지막 스테이지 클리어 여부니깐 스테이지가 아님
return newArr.slice(0, newArr.length-1);
}
function solution(N, stages) {
// 도달했으나 아직 클리어하지 못한 플레이어의 수 / 스테이지에 도달한 플레이어 수
// 전체 스테이지의 개수 N
// 게임을 이용하는 사용자가 현재 멈춰있는 스테이지의 번호가 담긴 배열 stage
// 스테이지에 도달한 플레이어 수 === 전체 플레이어 수 - 이전 스테이지 클리하지 못한 // 수
// 멈춰있는 스테이지별 배열을 만든다.
// 실패율을 모아놓은 배열을 만든다.
const answer = [];
const sortedStages = sortStages(N,stages);
console.log(sortedStages);
const failureRates = getFailureRates(sortedStages, stages.length)
console.log(failureRates);
failureRates.sort((a , b)=>{
if(a.value > b.value){
return -1;
}
if(a.value < b.value){
return 1;
}
return 0;
});
// 정렬된 객체 배열의 index 값을 순서대로 담아준다.
for(obj of failureRates){
answer.push(obj['index']);
}
return answer;
}
<승연님 (객체로 sort)>
function solution(N, stages) {
let opened = 0;
let unclear = 0;
let stageFailrate = [];
//스테이지(N)별 클리어 못한 플레이어 수 찾기
for(let i = 1; i <= N; i++){
unclear = stages.filter((player) => i === player).length; //클리어 못한자 = 현재 스테이지 i 레벨이랑 같은자
opened = stages.filter((player) => i <= player).length; //해당 스테이지가 열린자 == i스테이지보다 같거나 큰자
let failrate = unclear / opened;
stageFailrate.push({stage: i, rate : failrate }); //객체형태로 {스테이지레벨:실패율}을 결과배열안에 푸시
} // {stage 2 : rate : 0.42...}
//실패율이 높은것 내림차순 정렬하기
//일단 객체로 푸시를하긴했는데, 어떻게 정렬할지몰라서 검색해봤는데..겉에게 배열이니까 sort를 할 수있엇슴.
//오 지저스 배열안 내용물이 객체여도 sort가 먹잖아?
//mdn | 개체는 해당 속성 중 하나의 값을 기준으로 정렬 할 수 있습니다 의 예시를 따라함.
stageFailrate.sort((a,b)=> {
if(a.rate === b.rate) return a.stage - b.stage; //실패율이 같으면 낮은레벨 스테이지가 먼저오게 해준다.
else return b.rate - a.rate; //그게아니라면 높은 실패율부터 내림차순되게 해준다.
});
//이제 실패율이 높은것 부터 객체로 담겨있는 배열을
return stageFailrate.map((obj) => obj.stage); //객체의 stage값 으로만 남겨두기로 맵핑
} //[3,4,2,1,5]