문제
로또 6/45
(이하 '로또'로 표기)는 1부터 45까지의 숫자 중 6개를 찍어서 맞히는 대표적인 복권입니다. 아래는 로또의 순위를 정하는 방식입니다.
로또를 구매한 민우는 당첨 번호 발표일을 학수고대하고 있었습니다. 하지만, 민우의 동생이 로또에 낙서를 하여, 일부 번호를 알아볼 수 없게 되었습니다. 당첨 번호 발표 후, 민우는 자신이 구매했던 로또로 당첨이 가능했던 최고 순위와 최저 순위를 알아보고 싶어 졌습니다.
더보기
나의 풀이
function solution(lottos, win_nums) {
let zeroCount = lottos.filter(e => e === 0).length;
let sum = 0;
// lottos & win_nums 중복 확인
for(let i = 0; i < 6; i++) {
for(let j = 0; j < 6; j++) {
if(lottos[i] === win_nums[j]) sum++;
}
}
// 같은 요소 개수
// 1. 0이 없다면: if(같은 요소x) => 최고0,최저0 / (같은 요소ㅇ) => 최고,최저:같은 요소 개수
// 2. 0이 1~5개: if(같은 요소x) => 최고: 0개수, 최저:0 / (같은 요소ㅇ) => 최고:같은요소+0의개수, 최저:같은요소
// 3. 다 0이라면=> 최고:6, 최저: 0
let rank = [6,6,5,4,3,2,1];
if(zeroCount === 0) {
return sum ? [rank[sum], rank[sum]] : [6,6];
}
else if(zeroCount > 0 && zeroCount < 6) {
return sum ? [rank[sum + zeroCount], rank[sum]] : [rank[zeroCount], 6];
}
else if(zeroCount === 6) return [1, 6];
}
또 한 번의 판단 미스....
단순하게 같은 요소 개수와 0의 개수로 계산하려다가 어림짐작으로 0의 개수에 따라 결과가 달라지는 것 같아서
조건문으로 어렵게 풀었는데... 아니었다.
역시 문제는 끝까지 풀고, 망한 풀이 같더라도 주석으로 남겨놓을 것!
정확도 테스트 결과
통과했고 속도도 나쁘지 않게 나오긴 했다.
모범 답안
function solution(lottos, win_nums) {
// 최고 순위 : 같은 요소 + 0 개수
// 최저 순위 : 같은 요소
let minCount = lottos.filter(e => win_nums.includes(e)).length;
let maxCount = lottos.filter(e => e === 0).length + minCount;
let rank = [6,6,5,4,3,2,1];
return [rank[maxCount], rank[minCount]];
}
놀랍게 간결한 코드
역시 for문 중첩이 사용되면 다른 방법을 더 모색해봐야 한다.
체크 포인트
배열 & 배열 중복 찾기 (for문 중첩하지 말자!)
- 중복 배열 만들기 :
arr1.filter(e => arr2.includes(e))
- 중복 요소 갯수 :
arr1.filter(e => arr2.includes(e)).length
- 중복 배열 만들기 :
조건
e === 0
는!e
로 쓸 수 있다.
e
가 0이면false
, 그러므로!e
는true
가 되기 때문이다.
정확도 테스트 결과
속도는 나의 풀이보다 빠르지만, 어떤 테스트는 더 느리다.
하지만 코드가 간결하니 베스트!
'Coding test' 카테고리의 다른 글
[프로그래머스] 예산 (Level 1) - javascript (0) | 2022.04.23 |
---|---|
[프로그래머스] 폰켓몬 (Level 1) - javascript (0) | 2022.04.22 |
[프로그래머스] 모의고사 (Level 1) (0) | 2022.04.21 |
[프로그래머스] 다트 게임 (Level 1) (0) | 2022.04.21 |
[프로그래머스] 체육복 (Level 1) (0) | 2022.04.21 |