
로또 6/45(이하 '로또'로 표기)는 1부터 45까지의 숫자 중 6개를 찍어서 맞히는 대표적인 복권입니다. 아래는 로또의 순위를 정하는 방식입니다. 1
순위 당첨 내용 1 6개 번호가 모두 일치 2 5개 번호가 일치 3 4개 번호가 일치 4 3개 번호가 일치 5 2개 번호가 일치 6(낙첨) 그 외
로또를 구매한 민우는 당첨 번호 발표일을 학수고대하고 있었습니다. 하지만, 민우의 동생이 로또에 낙서를 하여, 일부 번호를 알아볼 수 없게 되었습니다. 당첨 번호 발표 후, 민우는 자신이 구매했던 로또로 당첨이 가능했던 최고 순위와 최저 순위를 알아보고 싶어 졌습니다.
알아볼 수 없는 번호를0으로 표기하기로 하고, 민우가 구매한 로또 번호 6개가44, 1, 0, 0, 31 25라고 가정해보겠습니다. 당첨 번호 6개가31, 10, 45, 1, 6, 19라면, 당첨 가능한 최고 순위와 최저 순위의 한 예는 아래와 같습니다.
당첨 번호 31 10 45 1 6 19 결과 최고 순위 번호 31 0→10 44 1 0→6 25 4개 번호 일치, 3등 최저 순위 번호 31 0→11 44 1 0→7 25 2개 번호 일치, 5등
- 순서와 상관없이, 구매한 로또에 당첨 번호와 일치하는 번호가 있으면 맞힌 걸로 인정됩니다.
- 알아볼 수 없는 두 개의 번호를 각각 10, 6이라고 가정하면 3등에 당첨될 수 있습니다.
- 3등을 만드는 다른 방법들도 존재합니다. 하지만, 2등 이상으로 만드는 것은 불가능합니다.
- 알아볼 수 없는 두 개의 번호를 각각 11, 7이라고 가정하면 5등에 당첨될 수 있습니다.
- 5등을 만드는 다른 방법들도 존재합니다. 하지만, 6등(낙첨)으로 만드는 것은 불가능합니다.
민우가 구매한 로또 번호를 담은 배열 lottos, 당첨 번호를 담은 배열 win_nums가 매개변수로 주어집니다. 이때, 당첨 가능한 최고 순위와 최저 순위를 차례대로 배열에 담아서 return 하도록 solution 함수를 완성해주세요.
입출력 예 #2
알아볼 수 없는 번호들이 아래와 같았다면, 1등과 6등에 당첨될 수 있습니다.
| 당첨 번호 | 38 | 19 | 20 | 40 | 15 | 25 | 결과 |
|---|---|---|---|---|---|---|---|
| 최고 순위 번호 | 0→38 | 0→19 | 0→20 | 0→40 | 0→15 | 0→25 | 6개 번호 일치, 1등 |
| 최저 순위 번호 | 0→21 | 0→22 | 0→23 | 0→24 | 0→26 | 0→27 | 0개 번호 일치, 6등 |
입출력 예 #3
민우가 구매한 로또의 번호와 당첨 번호가 모두 일치하므로, 최고 순위와 최저 순위는 모두 1등입니다.
//처음 답안
function solution(lottos, win_nums) {
let MaxRank = 0, MinRank = 0, correctCount = 0, unknownNums = 0;
for (let i=0; i<lottos.length; i++) {
if (lottos.includes(win_nums[i])) {
correctCount++;
}
if (lottos[i] === 0) unknownNums++;
}
switch(unknownNums + correctCount) {
case 6:
MaxRank = 1;
break;
case 5:
MaxRank = 2;
break;
case 4:
MaxRank = 3;
break;
case 3:
MaxRank = 4;
break;
case 2:
MaxRank = 5;
break;
default:
MaxRank = 6;
}
switch (correctCount) {
case 6:
MinRank = 1;
break;
case 5:
MinRank = 2;
break;
case 4:
MinRank = 3;
break;
case 3:
MinRank = 4;
break;
case 2:
MinRank = 5;
break;
default:
MinRank = 6;
}
return [MaxRank, MinRank];
}
ㅋㅋㅋㅋㅋㅎㅎ… 더 좋은 방법이 있겠지만 생각하기 싫어서 가장 먼저 떠오른 단순한 방법으로 풀이했다. 어딘가 민망한 코드이긴 하지만 명확하고 이해하기 쉬운 구조라고 생각한다. includes()나 filter()를 사용해서 새로 풀어봐야겠다.
function solution(lottos, win_nums) {
const answer = [];
const min = lottos.filter(n => win_nums.includes(n)).length;
const max = lottos.filter(n => n === 0).length + min;
max > 1 ? answer.push(7 - max) : answer.push(6);
min > 1 ? answer.push(7 - min) : answer.push(6);
return answer;
}
먼저 당첨 번호와 일치하는 로또 번호의 개수를 min에, 그리고 알아볼 수 없는 번호의 수와 그 일치하는 로또의 개수를 더한 값을 max에 할당하였다. 그리고 그 둘의 값이 1보다 크지 않다면 최고 순위와 최저 순위를 모두 6위로, 1보다 크다면 7에서 max 값을 뺀 걸 최고 순위, min 값을 뺀 걸 최저 순위로 배열에 추가하여 리턴하였다.