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

맹뿌·2021년 7월 3일
0

알고리즘 문제

목록 보기
2/5
post-thumbnail

💬 문제 요약

민우는 로또를 구매함. 그러나 민우의 동생이 로또에 낙서를 하여, 일부 번호를 알아볼 수 없음. 알아볼 수 없는 번호를 '0'으로 표기하고, 민우가 구매한 로또로 당첨이 가능한 최고 순위와 최저 순위를 알아보자.

  • 6개 일치 : 1등
    5개 일치 : 2등
    4개 일치 : 3등
    3개 일치 : 4등
    2개 일치 : 5등
    1개 일치 : 6등
    그 외 : 6등

💬 풀이 방법

function solution(lottos, win_nums) {
    var answer = [];
    let highest_rank = 0;
    let lowest_rank = 0;
    let zero = 0;
    let correct_nums = 0;

    for(let i=0 ; i < lottos.length ; i++) {
        for(let j=0 ; j < win_nums.length ; j++) {
            if(win_nums[j] === lottos[i])
                correct_nums += 1;
        }
        if(lottos[i] === 0)
            zero += 1;
    }

    if((correct_nums == 0) && (zero == 6)) {
        highest_rank = 1;
        lowest_rank = 6;
    }
    else if((correct_nums == 0) && (zero == 0)) {
        highest_rank = 6;
        lowest_rank = 6;
    }
    else {
        highest_rank = (7 - (correct_nums + zero));
        lowest_rank = (7 - correct_nums);
    }

    answer = [highest_rank, lowest_rank];

    return answer;
}

highest_rank와 lowest_rank를 파악하기에 앞서 당첨 번호와 일치하는 번호의 갯수와 0의 갯수를 파악하기로 했다. highest_rank는 '7에서 correct_nums와 zero를 더한 것을 빼면' 되고, lowest_rank는 '7에서 correct_nums를 빼면' 된다.

왜 7에서 빼냐면, 0개를 맞춰서 6등을 하는 경우를 제외하면 등수와 일치한 숫자의 갯수를 더하면 7이기 때문이다. 이 방법의 경우, rank 계산을 할 때 if 조건문들로 예외의 경우를 따져주어야 한다는 번거로움이 있다.

일단 중첩 for문을 써서 민우의 복권 번호와 당첨 번호가 일치하는 correct_nums와 0의 갯수를 파악했다. correct_nums는 무조건 당첨된 번호 갯수이고, zero는 다 맞을수도, 다 틀릴수도 있는 갯수이다.

원래 highest_rank와 lowest_rank를 계산할 때

highest_rank = (7 - (correct_nums + zero));
lowest_rank = (7 - correct_nums);

이렇게만 적으면 될거라고 생각했다. 그런데 코드를 실행해보니 테스트 14가 계속 실패하더라. 곰곰히 생각해보니 예외의 경우가 있었다. correct_nums가 0이고 zero가 6일 때는 lowest_rank가 7이 된다... correct_nums가 0이고 zero가 0일 때는 highest_rank와 lowest_rank가 둘 다 7이 된다.... 이렇게 두 경우를 예외의 경우로 보고 if 조건문에 추가해서 코드를 작성했더니 테스트 14도 통과가 되었다.

나만 너무 복잡한가 싶어서 다른 분들이 작성하신 코드도 보았다. 오,,, 내 코드만 복잡하더라...(?)ㅋㅋㅋㅋ rank를 애초에 array로 작성하고 코드를 작성한 경우가 꽤 많았다. 역시.. 간략한 코드 작성을 위해선.. 가방끈이 길어야 한다..

🎁 문제 출처

profile
무엇이든 할 수 있고, 무엇이든 될 수 있는

0개의 댓글