[프로그래머스] 로또의 최고 순위와 최저 순위 (JavaScript)

ssjeu·2022년 5월 18일
0

Algorithm

목록 보기
8/14

문제 설명

로또의 최고 순위와 최저 순위

로또 6/45(이하 '로또'로 표기)는 1부터 45까지의 숫자 중 6개를 찍어서 맞히는 대표적인 복권입니다. 아래는 로또의 순위를 정하는 방식입니다.

순위	당첨 내용
1	6개 번호가 모두 일치
2	5개 번호가 일치
3	4개 번호가 일치
4	3개 번호가 일치
5	2개 번호가 일치
6(낙첨)	그 외

로또를 구매한 민우는 당첨 번호 발표일을 학수고대하고 있었습니다. 하지만, 민우의 동생이 로또에 낙서를 하여, 일부 번호를 알아볼 수 없게 되었습니다. 당첨 번호 발표 후, 민우는 자신이 구매했던 로또로 당첨이 가능했던 최고 순위와 최저 순위를 알아보고 싶어 졌습니다.

민우가 구매한 로또 번호를 담은 배열 lottos, 당첨 번호를 담은 배열 win_nums가 매개변수로 주어집니다. 이때, 당첨 가능한 최고 순위와 최저 순위를 차례대로 배열에 담아서 return 하도록 solution 함수를 완성해주세요.

제한조건

  • lottos는 길이 6인 정수 배열입니다.
  • lottos의 모든 원소는 0 이상 45 이하인 정수입니다.
    • 0을 제외한 다른 숫자들은 lottos에 2개 이상 담겨있지 않습니다.
    • lottos의 원소들은 정렬되어 있지 않을 수도 있습니다.
  • win_nums은 길이 6인 정수 배열입니다.
  • win_nums의 모든 원소는 1 이상 45 이하인 정수입니다.
    • win_nums에는 같은 숫자가 2개 이상 담겨있지 않습니다.
    • win_nums의 원소들은 정렬되어 있지 않을 수도 있습니다.

입출력 예

lottoswin_numsresult
[44, 1, 0, 0, 31, 25][31, 10, 45, 1, 6, 19][3, 5]
[0, 0, 0, 0, 0, 0][38, 19, 20, 40, 15, 25][1, 6]
[45, 4, 35, 20, 3, 9][20, 9, 3, 45, 4, 35][1, 1]



문제 풀이

Solution 1)

function solution(lottos, win_nums) {
    let zero = lottos.filter((n) => n === 0).length; // 0의 개수
    let win = lottos.filter(n => win_nums.includes(n)).length; //로또번호와 일치하는 수
    
    let max = (win+zero == 0) ? 6 : 7 - win - zero;
    let min = (win == 0) ? 6 : 7 - win;
    let ans = [max, min];
    
    return ans;
}
  • max, min 구하는 식에서 당첨 숫자가 0개일 때 순위를 고려하지 않아 오류
    -> 문제에서 말하는 조건, 예외사항을 식으로 표현할 때 유의하기

Solution 2)

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;
}
  • solution1 과 유사, max와 min 관계를 통해 더 간결하게 표현
    -> min은 적혀있는 숫자만 당첨될 경우이기 때문에 max값은 min값과 0으로 적혀있는 숫자 수의 합

Solution 3)

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]];
}
  • rank[] 배열을 생성해 쉽게 접근
  • v => !v. : !0이 true 임을 이용

0개의 댓글