카테고리 없음

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

소스코드는 Github에서도 확인하실 수 있습니다.

 

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

 

풀이 🚀

  • 지워진 번호(알 수 없는 번호)를 0으로 표기한다.
  • 순위를 매기는 기준은 다음 표와 같다.
순위 당첨 내용
1 6개 번호가 모두 일치
2 5개 번호가 일치
3 4개 번호가 일치
4 3개 번호가 일치
5 2개 번호가 일치
6(낙첨) 그 외

구매한 로또 번호가 [44, 1, 0, 0, 31, 25]이고, 당첨 번호가 [31, 10, 45, 1, 6, 19] 인 경우, 당첨될 수 있는 최고 순위와 최저 순위는 몇 위일까?

 

우선 구매한 로또 번호에서 알 수 없는 번호인 0의 개수를 센다. 

- 만약 0의 개수가 로또 번호의 총 개수와 같다면, 모든 번호를 알아볼 수 없다는 의미이니 최고 1등, 최저 6등(낙첨)까지 가능하다.

당첨 번호를 순회하며 로또 번호에 당첨 번호와 일치하는 번호가 있는지 개수를 센다. 이 개수는 무조건 당첨되는 최저 순위를 나타낸다. (why? 알 수 없는 번호인 0이 모두 당첨 번호가 아니더라도 당첨 번호와 일치하는 번호들이기 때문!)

 

따라서 최저 순위는 로또 번호에 당첨 번호와 일치하는 번호의 개수를 통해 계산할 수 있으며,

최고 순위는 알 수 없는 번호인 0의 개수를 최저 순위를 구할 때 계산해 둔 로또 번호에 당첨 번호와 일치하는 번호의 개수에 더함으로서 계산할 수 있다.

 

알고리즘 풀이 과정을 적으면서 느끼는 거지만 내 머릿속의 풀이 과정을 글로 옮기는 것은 매우 어려운 일인 것 같다. 😞

 

소스코드 👩🏻‍💻

import java.util.*;

class Solution {
    public int[] solution(int[] lottos, int[] win_nums) {
        int[] answer = new int[]{1, 6}; // 모두 0인 경우를 default로 둔다.
        List<Integer> lottoList = new ArrayList<>();
        for (int lotto : lottos) {
            lottoList.add(lotto);
        }
        final int size = lottoList.size();
        final int zeros = Collections.frequency(lottoList, 0);
        
        if (zeros == size) {
            return answer;
        }
        
        int lowestRank = 0;
        for (int win_num : win_nums) {
            if (lottoList.contains(win_num)) { // 우승 번호를 갖고 있다면
                lowestRank += 1;
            }
        }
        final int highestRank = zeros + lowestRank;
        answer[0] = convertToRank(highestRank);
        answer[1] = convertToRank(lowestRank);
        return answer;
    }
    
    private int convertToRank(final int counts) {
        if (counts == 1 || counts == 0) {
            return 6;
        }
        return 7 - counts;
    }
}