본문 바로가기
Algorithm/Programmers

[Programmers] 로또의 최고 순위와 최저 순위(JavaScript)

by 백승전 2022. 7. 20.

 

알림

 

본 포스팅은 공부 목적으로 작성된 글이며 상업적 목적으로 절대 사용되지 않았음을 밝힙니다.

 

문제

 

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

 

프로그래머스

코드 중심의 개발자 채용. 스택 기반의 포지션 매칭. 프로그래머스의 개발자 맞춤형 프로필을 등록하고, 나와 기술 궁합이 잘 맞는 기업들을 매칭 받으세요.

programmers.co.kr

 

문제가 길어 생략합니다.

 

코드

 

function solution(lottos, win_nums) {
    var answer = [];
    
    const sames = lottos.filter(lottos => win_nums.includes(lottos)).length;
    const zeros = lottos.filter(lottos => lottos === 0).length;
    
    var min = 7 - sames >= 6 ? 6 : 7 - sames;
    var max = min - zeros <= 1 ? 1 : min - zeros;
    
    return answer = [max, min];
}

 

풀이

 

이를 풀이하면서 두 개의 관문을 마주했습니다.

 

첫 번째로, 순서와 상관 없이 숫자를 비교하면 될 줄 알고 오름차순으로 정렬 후 반복문으로 비교를 하려고 했는데요.

하지만 이는 0이 있다는 걸 인지하지 못 한 풀이였고, 의미가 없어져서 바로 철회했습니다.

 

우선 문제를 풀이할 때 중요했던 건, 원초적으로 로또에서 가장 중요한 '일치하는 개수'를 찾는 것과, 해당 문제에 한해서 지워진 수를 정답이라 가정해야 하기 때문에 '0의 개수'를 찾는 것이었습니다.

 

따라서 lottos에 filter 함수를 통해, 로또 번호와 추첨 번호가 같으면 이를 sames란 변수에 할당하였고, 내 로또 번호 중 0의 개수를 필터링 해 zeros란 변수에 할당해 줬습니다.

 

이제 구해야 할 건 가장 중요한 최고 순위와 최소 순위인데요.

이론적으로 최저 순위는 그냥 같은 번호, 즉 sames이고, 최고 순위는 같은 번호에 0의 개수를 더한, sames + zeros입니다.

 

두 번째 관문이 바로 이 부분인데, 문제에서 요구하는 바는 그저 일치하는 개수와 0의 개수가 아닌 이를 토대로 매긴 순위였던 것입니다.

결국 개수를 가공하여 어떻게 하면 순위를 도출할 수 있을까 고민했습니다.(결국 실패하고 구글링..)

 

먼저 최소 순위 min은, 0개나 1개를 맞혔을 경우(sames) 6위이기 때문에, 7에서 sames를 뺀 값이 6보다 크거나 같으면(0개나 1개만 맞힐 때만 가능한 경우의 수) 6을 출력(6위), 그게 아니면 7에서 sames를 뺀 값을 그대로 출력하도록 조건문을 작성해줄 수 있습니다.

 

function solution(lottos, win_nums) {
    const sames = lottos.filter(lottos => win_nums.includes(lottos)).length;
    const zeros = lottos.filter(lottos => lottos === 0).length;
    
    var min = 7 - sames >= 6 ? 6 : 7 - sames;
}

 

그리고 최고 순위 max는 다음과 같이 코드를 작성했는데요.

 

function solution(lottos, win_nums) {
    const sames = lottos.filter(lottos => win_nums.includes(lottos)).length;
    const zeros = lottos.filter(lottos => lottos === 0).length;
    
    var max = min - zeros <= 1 ? 1 : min - zeros;
}

 

예를 들어, 최소 순위가 6위일 경우, 1) 0이 6개여서 6위일 수도 있고, 2) 정말 번호 6개가 전부 일치하지 않아 6위일 수도 있습니다.

 

1) 0이 6개여서 6위인 경우, 6 - 6은 1보다 작거나 같기 때문에, 결국 0이 전부 추첨 번호와 일치하게 바뀔 것이고 이는 곧 1위로 리턴해줄 수 있는 겁니다.

2) 번호 6개가 전부 일치하지 않는 경우, 6 - 0은 1보다 크기 때문에 그대로 6위를 리턴해주면 됩니다.

 

한 가지 더 예를 들어, 최소 순위가 5위일 경우, 1) 0이 4개여서 5위일 수도 있고, 2) 정말 번호 4개가 일치하지 않아 5위일 수도 있습니다.

 

1) 0이 4개여서 5위인 경우, 5 - 4는 1보다 작거나 같기 때문에, 0이 전부 정답으로 인정돼 1위 리턴이 가능한 것이며, 1보다 크다면, 0과 무관하게 그냥 다른 번호이기 때문에 현재 값을 그대로 리턴하여 순위를 매겨주면 됩니다.

 

결국 문제에서 '0일 경우 정답으로 인정'한다는 조건을 만족하기 위해 이처럼 코드를 작성한 것인데요.

최소 순위에서 0의 개수를 뺀 값이 1보다 작거나 같다는 것은, 결국 일치하지 않는 수가 '쌩으로' 틀린 게 아닌, '0이어서' 틀린 것을 찾아내는 과정으로, 이처럼 작성해야 문제에서 의도한 대로 최고 순위 또한 고려하여 도출해낼 수 있습니다.

댓글