ABOUT ME

-

Today
-
Yesterday
-
Total
-
  • [프로그래머스, Lv1] 로또의 최고 순위와 최저 순위
    알고리즘 문제/Java 2024. 8. 6. 20:51

    코딩테스트 연습 - 로또의 최고 순위와 최저 순위 | 프로그래머스 스쿨 (programmers.co.kr)

     

    프로그래머스

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

    programmers.co.kr

     

    문제설명

    로또 6/45(이하 '로또'로 표기)는 1부터 45까지의 숫자 중 6개를 찍어서 맞히는 대표적인 복권입니다. 아래는 로또의 순위를 정하는 방식입니다.

     

    순위당첨 내용
    1 6개 번호가 모두 일치
    2 5개 번호가 일치
    3 4개 번호가 일치
    4 3개 번호가 일치
    5 2개 번호가 일치
    6(낙첨) 그 외

    로또를 구매한 민우는 당첨 번호 발표일을 학수고대하고 있었습니다. 하지만, 민우의 동생이 로또에 낙서를 하여, 일부 번호를 알아볼 수 없게 되었습니다.

    당첨 번호 발표 후, 민우는 자신이 구매했던 로또로 당첨이 가능했던 최고 순위와 최저 순위를 알아보고 싶어 졌습니다.
    알아볼 수 없는 번호를 0으로 표기하기로 하고, 민우가 구매한 로또 번호 6개가 44, 1, 0, 0, 31 25라고 가정해보겠습니다.

    당첨 번호 6개가 [ 31, 10, 45, 1, 6, 19 ]라면, 당첨 가능한 최고 순위와 최저 순위의 한 예는 아래와 같습니다.

    당첨 번호 [ 31,10,45,1,6,19 ] 결과
    최고 순위 번호 31 0→10 44 1 0→6 25 4개 번호 일치, 3등
    최저 순위 번호 31 0→11 44 1 0→7 25 2개 번호 일치, 5등
    • 순서와 상관없이, 구매한 로또에 당첨 번호와 일치하는 번호가 있으면 맞힌 걸로 인정됩니다.
    • 알아볼 수 없는 두 개의 번호를 각각 10, 6이라고 가정하면 3등에 당첨될 수 있습니다.
      • 3등을 만드는 다른 방법들도 존재합니다. 하지만, 2등 이상으로 만드는 것은 불가능합니다.
    • 알아볼 수 없는 두 개의 번호를 각각 11, 7이라고 가정하면 5등에 당첨될 수 있습니다.
      • 5등을 만드는 다른 방법들도 존재합니다. 하지만, 6등(낙첨)으로 만드는 것은 불가능합니다.

    민우가 구매한 로또 번호를 담은 배열 lottos, 당첨 번호를 담은 배열 win_nums가 매개변수로 주어집니다. 이때, 당첨 가능한 최고 순위와 최저 순위를 차례대로 배열에 담아서 return 하도록 solution 함수를 완성해주세요.

    제한사항

    • lottos는 길이 6인 정수 배열입니다.
    • lottos의 모든 원소는 0 이상 45 이하인 정수입니다.
      • 0은 알아볼 수 없는 숫자를 의미합니다.
      • 0을 제외한 다른 숫자들은 lottos에 2개 이상 담겨있지 않습니다.
      • lottos의 원소들은 정렬되어 있지 않을 수도 있습니다.
    • win_nums은 길이 6인 정수 배열입니다.
    • win_nums의 모든 원소는 1 이상 45 이하인 정수입니다.
      • win_nums에는 같은 숫자가 2개 이상 담겨있지 않습니다.
      • win_nums의 원소들은 정렬되어 있지 않을 수도 있습니다.

    접근 방법

    이 문제의 핵심 내용은 다음과 같았다.

    • 2개의 배열 내에 서로 일치하는 숫자의 개수를 구한다.
    • 숫자 0은 조커 넘버다.

    2개의 배열내에 서로 일치하는 숫자의 개수를 구하기 위해 2개의 배열을 정렬 후, 각 배열의 현재 위치를 표시하는 lottoIndex, winNumsIndex를 활용하여현재 위치의 값을 비교하며, 일치하는 횟수를 구했다.

     

    예를들어

    lotto[lottoIndex]의 값이 win_nums[winNumsIndex] 보다 클 경우

    winNumsIndex를 증가시켜 비교하였고,

     

    반대로 win_nums[winNumsIndex] 의 값이  lotto[lottoIndex]보다 클 경우

    lottoIndex를 증가시켜 비교해 나갔다.

     

    마지막으로 순위를 정할 때, 일치하는 횟수 + 0이 등장한 횟수를 통해

    순위를 정하는 방식으로 구현했다.

    최종 코드

    더보기
    import java.util.Arrays;
    
    class Solution {
        public int[] solution(int[] lottos, int[] win_nums) {
            int[] answer = {0, 0};
    
            int lottoIndex = 0;
            int winNumsIndex = 0;
            int joker = 0;
            int matchCount = 0;
    
            Arrays.sort(lottos);
            Arrays.sort(win_nums);
    
            while(lottoIndex < lottos.length && winNumsIndex < win_nums.length) {
                if(lottos[lottoIndex] == 0) {
                    ++joker;
                    ++lottoIndex;
                    continue;
                } 
    
                if(lottos[lottoIndex] == win_nums[winNumsIndex]) {
                    ++matchCount;
                    ++lottoIndex;
                    ++winNumsIndex;
                } else if(lottos[lottoIndex] > win_nums[winNumsIndex]) {
                    ++winNumsIndex;
                } else {
                    ++lottoIndex;
                }
            }
            
            answer[0] = Math.min(6 - (matchCount + joker - 1), 6);
            answer[1] = Math.min(6 - (matchCount - 1), 6);
    
            return answer;
        }
    }

     

    [ 통과 ]

     

Designed by Tistory.