이번엔 로또 당첨 여부를 알아본다. lottos와 win_nums가 pass된다. lottos에는 내가 뽑은 로또 번호가 있고 wins_nums에는 당첨번호가 적혀있다. 보통 로또와는 다르게 내가 뽑은 번호가 wins_nums에도 있으면 당첨 번호를 1개 획득한것이다.
근데 뽑은 번호중에 동생이 실수로 쥬스를 흘려서 지워진 번호가 있다. 그 번호는 0으로 표시한다. 이때 0이 모두 당첨되는 경우와 모두 당첨되지 않은 경우를 나뉘어 최대, 최소 순위가 매겨진다. 순위는 아래와 같이 측정된다.
순위 | 당첨내용 |
---|---|
1 | 6개 번호가 모두 일치 |
2 | 5개 번호가 모두 일치 |
3 | 4개 번호가 모두 일치 |
4 | 3개 번호가 모두 일치 |
5 | 2개 번호가 모두 일치 |
6(낙첨) | 그외 |
이때 최대와 최소순위를 리턴하여라.
예시
lottos win_nums result
[44, 1, 0, 0, 31, 25] [31, 10, 45, 1, 6, 19] [3, 5]
pseudo code
answer를 0으로 잡자.
lottos를 순회한다.
순회하면서 filter 또는 includes 또는 Set/has를 통해서 win_nums에서 일치하는 갯수와 0의 갯수를 알아내자
그리고 0의 갯수 + 일치하는 갯수 를 갖고 계산
일치하는 갯수만 가지고 계산!
answer를 리턴
요렇게 우선 로직을 짜고 나름대로 코드를 짜보았다.
function mySolution(lottos, win_nums) {
let answer = [];
let same = 0;
let zero = 0;
let combined;
for (let i = 0; i < lottos.length; i++) {
let found = win_nums.includes(lottos[i]);
if (found) {
same++;
}
if (lottos[i] === 0) zero++;
}
// 최대값계산
combined = same + zero;
if (combined === 6) answer.push(1);
else if (combined === 5) answer.push(2);
else if (combined === 4) answer.push(3);
else if (combined === 3) answer.push(4);
else if (combined === 2) answer.push(5);
else answer.push(6);
// 최솟값 계산
if (same === 6) answer.push(1);
else if (same === 5) answer.push(2);
else if (same === 4) answer.push(3);
else if (same === 3) answer.push(4);
else if (same === 2) answer.push(5);
else answer.push(6);
return answer;
}
근데 항상 그렇지만 훨씬 더 간단하게 만드는 방법이 있다. 당첨된 번호를 array에 넣은다음 length만 가지고 순위를 리턴하는 방법이다. 두가지 solution을 동시에 적어보겠다.
function solution2(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]];
}
function solution3(lottos, win_nums) {
const rank = [6, 6, 5, 4, 3, 2, 1];
let answer = [];
let min = [];
let max = [];
lottos.forEach((x) => {
if (x == 0) {
max.push(x);
return;
}
let val = win_nums.find((y) => y == x);
if (val) {
min.push(val);
max.push(val);
}
});
answer.push(rank[max.length]);
answer.push(rank[min.length]);
return answer;
}
// lottos win_nums result
// [44, 1, 0, 0, 31, 25] [31, 10, 45, 1, 6, 19] [3, 5]
쉬운 접근법이면서 깔끔하다. 오케이 끝!
최대 최소를 찾아내는 방법도 map/filter를 통해서 찾아냄.
solution2 에서 zero찾아낼때 !v로 찾아내는 방법도 신선했고.
담엔 map,filter,forEach같은 higher-order function으로 답을 찾아보려고 해봐야겠다.