[프로그래머스 | Javascript] 2021 Dev-Matching: 웹 백엔드 개발자(상반기) - 로또의 최고 순위와 최저 순위

박기영·2022년 9월 14일
0

프로그래머스

목록 보기
49/159

solution

function solution(lottos, win_nums) {
    let ans = [];
    
    // 0인 것의 개수
    let zeroNum = 0;
    
    for(let i = 0; i < lottos.length; i++){
        if(lottos[i] === 0){
            zeroNum++;
        }
    }
    
    // 당첨된 개수
    let count = 0;
    
    for(let i = 0; i < lottos.length; i++){
        if(win_nums.includes(lottos[i])){
            count++;
        }
    }
    
    // 당첨되지 않았으면서, 0이 아닌 것의 개수
    // 즉, 변경할 수 없는 완전한 탈락의 개수
    let fail = lottos.length - count - zeroNum;
    
    // 0은 추가적으로 최대 (로또 번호 - count - fail)만큼 당첨시킬 수도 있다.
    let max0Win = lottos.length - count - fail;
    
    // 최대 당첨 개수
    let final = count + max0Win;
    
    // 최소 0개만큼 추가로 당첨시킬 수 있으므로,
    // 그냥 count를 넣어주면, 그게 최소 당첨 개수이다.
    // 그렇게 최대의 경우와 최소의 경우로 배열을 만든다.
    let canWin = [final, count];
    
    for(let i = 0; i < canWin.length; i++){
        let ranking = canWin[i];
        
        // 등수 판단
        if(ranking === 6){
            ans.push(1);
        } else if(ranking === 5){
            ans.push(2);
        } else if(ranking === 4){
            ans.push(3);
        } else if(ranking === 3){
            ans.push(4);
        } else if(ranking === 2){
            ans.push(5);
        } else {
            ans.push(6);
        }
    }
    
    return ans;
}

0이 최대한으로 활용될 수 있는 경우와, 최소한으로 활용될 수 있는 경우를 생각할 수 있으면
생각보다 간단하게 풀어낼 수 있는 문제다.
코드와 함께 주석을 보면 이해가 빠르다.

다른 분 풀이

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]];
}

minCount는 당첨된 숫자를 제외하고, 전부 틀렸을 경우
즉, 0이 아무것도 맞춰주지 않았을 경우를 의미한다.

zeroCount는 lottos 배열에서 0인 것들만 추려낸 것으로
0이 최대로 맞춰줄 수 있는 경우를 의미한다.

maxCount는 필자와 동일한 로직인 것 같은데
최소 당첨 개수에 0이 맞춰줄 수 있는 숫자를 더한 것으로
완전하게 틀린 것들은 자동적으로 제외가 된 것을 알 수 있다.

그렇게 맞춘 개수를 인덱스로 활용해서 rank 배열에서 알맞은 값을 뽑아낸다.

profile
나를 믿는 사람들을, 실망시키지 않도록

0개의 댓글