Coding test

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

Jiwoo 2022. 4. 22. 16:26

문제

로또 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문 중첩이 사용되면 다른 방법을 더 모색해봐야 한다.
 

체크 포인트

  1. 배열 & 배열 중복 찾기 (for문 중첩하지 말자!)

    • 중복 배열 만들기 : arr1.filter(e => arr2.includes(e))
    • 중복 요소 갯수 : arr1.filter(e => arr2.includes(e)).length
       
  2. 조건 e === 0!e 로 쓸 수 있다.
    e가 0이면 false, 그러므로 !etrue가 되기 때문이다.
     

  • 정확도 테스트 결과


    속도는 나의 풀이보다 빠르지만, 어떤 테스트는 더 느리다.
    하지만 코드가 간결하니 베스트!