https://programmers.co.kr/learn/courses/30/lessons/42889
// 객체 이용 X
function solution(N,stages) {
var answer = [],
result = [];
for(var i =0; i < N; i++) {
var a = stages.filter(word => word >= i+1).length;
var b = stages.filter(word => word == i+1).length;
if( b===0){
result.push(0);
}else {
result.push(b/a);
}
}
for(var i =0; i < N; i++) {
var index = result.indexOf(Math.max.apply(null, result));
answer.push(index+1); //answer[i] = index+1;도 가능
result[index] = -1;
}
return answer;
}
// 객체 이용
function solution(N, stages){
var answer = [];
for( let i=1; i<=N; i++ ){
let top = stages.filter(el=>(el===i)).length;
let bottom = stages.filter(el=>(el>=i)).length;
if(bottom === 0){
answer.push({stageNumber:i, failRate: 0 });
}else{
answer.push({stageNumber:i, failRate: top / bottom });
}
}
return answer.sort((a,b)=>(b.failRate === a.failRate) ? a.stageNumber -b.stageNumber : b.failRate - a.failRate).map(el=>el.stageNumber);
}
ㅠㅠ시간이 너~무 오래 걸림... 기본적인 sort함수에서 비교부분을 놓침...
다른 사람의 풀이를 보니까 기본적으로 배열 안에 객체를 할당했어야 -> index, value를 따로 비교 기준으로 잡아야 하니까 => 내 방법도 틀린 건 아님
왜 틀렸? push, 배열 할당같은 거엔 문제 없었음. 단지 sort method에서 두 값이 같은 경우 오름차순으로 나타내는 걸 고려하지 않음. Q 왜 값이 같을 때 answer.sort((a,b)=>rate[b]-rate[a])
만으로 충분하지 않지? =>
1. sort비교가 순차적이지 않을 수도 있음
2. 주어진 배열이 순차적일 때만 제대로 작동하는 함수는 불완전한 것. 어떤 배열이 주어져도 제대로 동작하는 함수를 만들어야.
function solution(N, stages) {
var answer = [];
var top = [];
var bottom = [];
var rate = [];
for(var i=0; i<N; i++){
top[i] = stages.filter(el => (el === i+1)).length;
bottom[i] = stages.filter(el => (el >= i+1)).length;
answer[i]=i;
rate[i] = top[i] /bottom[i];
if(bottom[i] === 0){
rate[i] = 0;
}
} //top, bottom은 배열에 선언할 필요 없음. rate값을 rate 배열에 넣으면 됨. 지나치게 많은 배열 선언.
answer.sort((a,b)=>rate[b]-rate[a]); //문제였던 부분ㅠㅠ
//옳은 코드:answer.sort((a,b)=>rate[b]===rate[a]? a-b : rate[b]-rate[a]);
for(var i=0; i<N;i++){
answer[i] = answer[i] +1;
}
return answer;
}
//성공
function solution(N, stages) {
var answer = [];
var rate = [];
for(var i=0; i<N; i++){
var top = stages.filter(el => (el === i+1)).length;
var bottom = stages.filter(el => (el >= i+1)).length;
answer[i]=i;
rate[i] = top /bottom;
if(bottom === 0){
rate[i] = 0;
}
}
answer.sort((a,b)=>rate[b]===rate[a]? a-b : rate[b]-rate[a]);
for(var i=0; i<N;i++){
answer[i] = answer[i] +1;
}
return answer;
}
array.sort() method!!! 두 값이 같은 경우...ㅠㅠ