IT/Algorithm

프로그래머스) 로또의 최고 순위와 최저 순위

프티 2021. 7. 6. 20:30
반응형

https://programmers.co.kr/learn/courses/30/lessons/77484

 

코딩테스트 연습 - 로또의 최고 순위와 최저 순위

로또 6/45(이하 '로또'로 표기)는 1부터 45까지의 숫자 중 6개를 찍어서 맞히는 대표적인 복권입니다. 아래는 로또의 순위를 정하는 방식입니다. 1 순위 당첨 내용 1 6개 번호가 모두 일치 2 5개 번호

programmers.co.kr

 

풀이

일치하는 번호의 배열 cor_list와 가려져 보이지 않는 배열 zero_list를 만들었다.

 

win_nums에 대한 forEach 메소드로 값과 인덱스를 불러왔다.

그리고 lottos 배열에도 들어있는 숫자들을 cor_list에 넣었다.

lottos의 가려진 숫자 0은 zero_list에 넣었다.

 

최고 순위는 cor_list의 길이 + zero_list의 길이,

최저 순위는 cor_list의 길이에 의해 결정된다.

 

따라서 switch문을 사용하여 최고 순위를 결정하는 값의 case에 따라 answer에 최고 순위 등수를 매기고,

7개의 등수(1,2,3,4,5,6,6에 해당)에서 cor_list의 길이 값을 빼는 것을 삼항 연산자로 처리하여 최저 순위를 매겼다.

 

function solution(lottos, win_nums) {
    var answer = [];
    var cor_list = [];
    var zero_list = [];
    
    win_nums.forEach((nums,i)=>{
        if(lottos.includes(nums) === true){
            cor_list.push(nums);
        }
        if(lottos[i] === 0){
            zero_list.push(lottos[i]);
        }
    });
    
    switch(cor_list.length + zero_list.length){
        case 6:
            answer.push(1,7-cor_list.length === 7 ? 6:7-cor_list.length);
            break;
        case 5:
            answer.push(2,7-cor_list.length === 7 ? 6:7-cor_list.length);
            break;
        case 4:
            answer.push(3,7-cor_list.length === 7 ? 6:7-cor_list.length);
            break;
        case 3:
            answer.push(4,7-cor_list.length === 7 ? 6:7-cor_list.length);
            break;
        case 2:
            answer.push(5,7-cor_list.length === 7 ? 6:7-cor_list.length);
            break;
        default:
            answer.push(6,6);
    }
    
    return answer;
}

 

다른 사람의 풀이

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 리스트를 만들어 마지막에 인덱스로 순위를 찾을 수 있게 하였다.

 

minCount는 filter 메소드로 lottos와 win_nums에 모두 존재하는 값만 남겼고,

zeroCount에는 !v인 값을 남기도록 하였는데,

보통 0이 아닌 수는 !숫자 = false이다.

 

따라서 !숫자 = true인 유일한 숫자인 0을 남기도록 하였다.

그렇게 만든 배열로 최고 순위와 최저 순위를 rank에 인덱스로 사용하여 구한다.

끝!

 

이 분이 작성한 코드의 rank처럼 간단하게 순위를 구할 수 있었지만

코드를 간결하게 작성하려면 되도록 메소드를 사용해야 한다는 내 생각이 오히려 코드를 길게 쓰게 하는 이유인 것 같다.

 

앞으로는 여러 방면으로 열어두고 생각해야겠다. 

 

반응형