티스토리 뷰

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

 

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

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

programmers.co.kr

해결방법

1. 최고로 많이 맞힌 개수와 최저로 맞힌 개수가 담긴 배열을 만든다 

2. 그 배열에 든 숫자를 차례로 비교하여 6이면 1을 answer에 push, ~ 1이면 6을 push한다

 

풀이

function solution(lottos, win_nums) {
    var same = [0, 0]; //[최고순위, 최저순위]
    var answer = [];

    for (let i of lottos) {
        if (win_nums.includes(i)) {same[0]++; same[1]++;}
        if (i === 0) same[0]++;
    }
    for (num of same) {
        if (num === 6) answer.push(1);
        else if (num === 5) answer.push(2);
        else if (num === 4) answer.push(3);
        else if (num === 3) answer.push(4);
        else if (num === 2) answer.push(5);
        else answer.push(6);
    }
    return answer;
}

 

 

배운 점

1. else if를 다 돌 필요가 없다면 switch

다른 사람들의 풀이를 보다 switch를 사용한 코드를 발견했다

생각해보니 내가 짠 코드는 else if가 여러개인데 첫 번째 else if를 만족해도 마지막 else if 까지 다 돌아야 한다는 단점이 있었다

switch를 사용한다면 만족하는 라인에서 braek로 멈추기 때문에 시간을 더 절약할 수 있겠다는 생각이 들었다

switch를 사용해 다시 짠 코드는 다음과 같다

function solution(lottos, win_nums) {
    var same = [0, 0];
    var answer = [];

    for (let i of lottos) {
        if (win_nums.includes(i)) {same[0]++; same[1]++;}
        if (i === 0) same[0]++;
    }
    for (num of same) {
        switch (num) {
            case 6:
                answer.push(1);
                break;
            case 5:
                answer.push(2);
                break;
            case 4:
                answer.push(3);
                break;
            case 3:
                answer.push(4);
                break;
            case 2:
                answer.push(5);
                break;
            default:
                answer.push(6);
                break;
        }
    }
    return answer;
}

 

2. 7에서 뺀 값

단순하게 6개면 1, 5개면 2, 4개면 3.. 이런식으로 if문이나 switch를 이용할 수도 있으나 더 간단한 방법을 고민해봤다

규칙을 살펴보니 6개부터 2개까지는 7에서 뺀 값을 push하면 된다는 것을 발견했다

1개보다 많으면 7에서 뺀 값을 push하고 그렇지 않다면 6을 push하여 다음과 같이 전체적인 코드 길이를 줄였다

function solution(lottos, win_nums) {
    var same = [0, 0];//[최고순위, 최저순위]
    var answer = [];

    for (let i of lottos) {
        if (win_nums.includes(i)) {same[0]++; same[1]++;}
        if (i === 0) same[0]++;
    }
    for (num of same) {
        num > 1 ? answer.push(7 - num) : answer.push(6);
    }
    return answer;
}

 

3. 센스있는 배열로

rank = [6, 6, 5, 4, 3, 2, 1] 를 선언하여 만약 숫자가 3이라면 rank[3]인 4를 출력하는 방법도 있었다

function solution(lottos, win_nums) {
    var same = [0, 0];//[최고순위, 최저순위]
    var rank = [6, 6, 5, 4, 3, 2, 1];

    for (let i of lottos) {
        if (win_nums.includes(i)) {same[0]++; same[1]++;}
        if (i === 0) same[0]++;
    }
    return [rank[same[0]],rank[same[1]]];
}

 

 

댓글