https://programmers.co.kr/learn/courses/30/lessons/77484
switch 문으로 나누기에 경우의 수가 너무 많이 나와서, filter() 메서드를 이용하기로 한다.
sol 1
const lottos = [44, 1, 0, 0, 31, 25];
const win_nums = [31, 10, 45, 1, 6, 19];
const rank = [6,5,4,3,2,1];
let answer = [];
const min = lottos.filter(v => win_nums.includes(v)).length;
const max = lottos.filter(v => v === 0).length + min;
rank.includes(min) ? answer.push(rank.indexOf(min)+1) : answer.push(6);
rank.includes(max) ? answer.push(rank.indexOf(max)+1) : answer.push(6);
console.log(answer); // [ 5, 3 ]
rank 배열을 만들어주고, filter()와 includes() 메서드로 당첨 번호만 골라낸다. 0이 나온 경우도 당첨된다는 가정으로 포함시키고 answer 배열에 넣어준다. 인덱스와 순위가 맞지 않아 각각 +1 해줬는데, 아래 풀이의 배열 방식은 이 과정을 생략해도 돼서 좋은 것 같다.
sol 2
const lottos = [44, 1, 0, 0, 31, 25];
const win_nums = [31, 10, 45, 1, 6, 19];
function solution1(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[minCount], rank[maxCount]];
}
console.log(solution1(lottos,win_nums))
zeroCount 변수에 !v 를 활용한 게 인상 깊었다. 문제에서 주어준 0을 !0으로 받아 true가 되게 해 준다.
첫 문제에서 filter() 메서드도 두 번 썼기 때문에 배열을 잘 활용하면 이 과정도 줄일 수 있을 거 같은데.. 아직 거기까지 생각나질 않는다. 프로그래머스 다른 풀이의 댓글 중 이번 문제의 경우 6자리이기 때문에 includes() 메서드를 써도 괜찮았지만, 입력으로 네 자릿수를 받거나 하게 된다면 배열의 모든 인덱스를 탐색해야 하므로 시간 복잡도가 증가할 수 있다고 했다. 여기서 좀 더 복잡한 문제를 풀 때 참고해야겠다.
'Study > Algorithm' 카테고리의 다른 글
[BEAKJOON / node.js] 1931 회의실 배정 (0) | 2022.05.24 |
---|---|
<BEAKJOON / node.js> 11047 동전 0 (0) | 2022.05.22 |
[programmers / JavaScript] K번째 수 (0) | 2022.05.06 |
[BEAKJOON / node.js] 5533 유니크 (0) | 2022.05.02 |
[programmers / JavaScript] 숫자 문자열과 영단어 (0) | 2022.04.30 |