function solution(lottos, win_nums) {
let ans = [];
// 0인 것의 개수
let zeroNum = 0;
for(let i = 0; i < lottos.length; i++){
if(lottos[i] === 0){
zeroNum++;
}
}
// 당첨된 개수
let count = 0;
for(let i = 0; i < lottos.length; i++){
if(win_nums.includes(lottos[i])){
count++;
}
}
// 당첨되지 않았으면서, 0이 아닌 것의 개수
// 즉, 변경할 수 없는 완전한 탈락의 개수
let fail = lottos.length - count - zeroNum;
// 0은 추가적으로 최대 (로또 번호 - count - fail)만큼 당첨시킬 수도 있다.
let max0Win = lottos.length - count - fail;
// 최대 당첨 개수
let final = count + max0Win;
// 최소 0개만큼 추가로 당첨시킬 수 있으므로,
// 그냥 count를 넣어주면, 그게 최소 당첨 개수이다.
// 그렇게 최대의 경우와 최소의 경우로 배열을 만든다.
let canWin = [final, count];
for(let i = 0; i < canWin.length; i++){
let ranking = canWin[i];
// 등수 판단
if(ranking === 6){
ans.push(1);
} else if(ranking === 5){
ans.push(2);
} else if(ranking === 4){
ans.push(3);
} else if(ranking === 3){
ans.push(4);
} else if(ranking === 2){
ans.push(5);
} else {
ans.push(6);
}
}
return ans;
}
0이 최대한으로 활용될 수 있는 경우와, 최소한으로 활용될 수 있는 경우를 생각할 수 있으면
생각보다 간단하게 풀어낼 수 있는 문제다.
코드와 함께 주석을 보면 이해가 빠르다.
function solution(lottos, win_nums) {
const rank = [6, 6, 5, 4, 3, 2, 1];
let minCount = lottos.filter(v => win_nums.includes(v)).length;
let zeroCount = lottos.filter(v => !v).length;
const maxCount = minCount + zeroCount;
return [rank[maxCount], rank[minCount]];
}
minCount는 당첨된 숫자를 제외하고, 전부 틀렸을 경우
즉, 0이 아무것도 맞춰주지 않았을 경우를 의미한다.
zeroCount는 lottos 배열에서 0인 것들만 추려낸 것으로
0이 최대로 맞춰줄 수 있는 경우를 의미한다.
maxCount는 필자와 동일한 로직인 것 같은데
최소 당첨 개수에 0이 맞춰줄 수 있는 숫자를 더한 것으로
완전하게 틀린 것들은 자동적으로 제외가 된 것을 알 수 있다.
그렇게 맞춘 개수를 인덱스로 활용해서 rank 배열에서 알맞은 값을 뽑아낸다.