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

최준호·2021년 7월 15일
0

algorithm

목록 보기
12/39

문제

제한사항

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

입출력 예

풀이

import java.util.Arrays;

public class LottoRanking {
    public static void main(String[] args) {
        LottoRanking l = new LottoRanking();
        int[] lottos = {44, 1, 0, 0, 31, 25};
        int[] win_nums = {31, 10, 45, 1, 6, 19};

        int[] solution = l.solution(lottos, win_nums);
        for (int i : solution) {
            System.out.println("i = " + i);
        }
    }
    public int[] solution(int[] lottos, int[] win_nums) {
        int[] answer = new int[2];
        //두 배열을 비교하여 몇개가 맞았는지
        //두 배열을 비교할때 이진 탐색으로 탐색
        int right = 0;
        int unknown = 0;
        //이진 탐색을 위해 미리 정렬
        Arrays.sort(win_nums);

        for(int l : lottos){
            int result = binarySearch(win_nums, l);
            if(result>0){
                right++;
            }else if(result==0){
                unknown++;
            }
        }
        //최고
        answer[0] = rank(right+unknown);
        //최저
        answer[1] = rank(right);
        return answer;
    }

    private int binarySearch(int[] win_nums, int key){
        if(key==0){
            return 0;
        }
        int res = -1;
        int mid;
        int left = 0;
        int right = win_nums.length - 1;

        while (right >= left) {
            mid = (right + left) / 2;

            if (key == win_nums[mid]) {
                return 1;
            }

            if (key < win_nums[mid]) {
                right = mid - 1;
            } else {
                left = mid + 1;
            }

        }
        return res;
    }

    private int rank(int right){
        if(right == 6){
            return 1;
        }else if(right == 5){
            return 2;
        }else if(right == 4){
            return 3;
        }else if(right == 3){
            return 4;
        }else if(right == 2){
            return 5;
        }
        return 6;
    }
}

이진 탐색을 써보고 싶었는데 사용할 문제가 딱 나왔다. 그래서 이진 탐색으로 풀었지만... 다른 풀이를 보니까 그냥 이중 for문 돌리니까 풀리는 문제긴 하더라..ㅎㅎ 그래도 걸리는 시간도 모두 1ms 안으로 풀리니깐 뭐... 그리고 또 아쉬웠던 점은 rank를 결정할때 if로 풀었다는거다... 제발 switch 좀 쓰세요...ㅎㅎ 그래도 어려울 줄 알았는데 생각보다 쉽게 풀었던 문제였다.

profile
코딩을 깔끔하게 하고 싶어하는 초보 개발자 (편하게 글을 쓰기위해 반말체를 사용하고 있습니다! 양해 부탁드려요!) 현재 KakaoVX 근무중입니다!

0개의 댓글