<풀기 전 생각>

핵심적으로 해야 할 것은 win_nums의 배열의 저장된 정수를 lottos에 몇개 나 가지고 있는지 탐색 하는 것 임으로

단순 반복으로 선형 탐색하여 해결 할 수도 있겠지만 O(n) 이진탐색 + 정렬 O(2log n)을 통해 속도를 더 개선시키자는 생각으로 문제 풀이에 들어갔다.

 

<중간 문제점>

단순히 Arrays.binarySearch(win_nums, lottos[i]) > -1 내장된 빌트인 함수를 사용할 수도 있겠지만

앞에 0의 갯수를 감안하여 이진 탐색의 범위를 좁히고 싶어 직접 구현하게 되었다.

 

<최종적인 코드>

class Solution {
    // 시간 복잡도 O(nlog n) 공간 복잡도 O(n)
    public int[] solution(int[] lottos, int[] win_nums) {
        int[] answer = new int[2];
        Arrays.sort(win_nums);
        int zeroCount = 0;
        int correctCount = 0;
        // 0의 갯수 체크
        for (int lotto: lottos) {
            if(lotto==0)
                zeroCount++;
            else
                break;
        }

        // 로또 번호 탐색 시작
        for (int num:win_nums) {
            int first = zeroCount;
            int last = lottos.length-1;
            // 이진 탐색
            while(first<=last){
                int mid = (first+last)/2;
                if(lottos[mid]>num)
                    last = mid-1;
                else if(lottos[mid]<num)
                    first = mid+1;
                else {
                    correctCount++;
                    break;
                }
            }
        }

        int maxCorrect = zeroCount+correctCount;
        int maxRank = 7-maxCorrect;
        answer[0] = maxRank>=6?6:maxRank;

        int minRank = 7-correctCount;
        answer[1] = minRank>=6?6:minRank;

        return answer;
    }
}

<메모> 

우수 풀이를 보니 Map 자료구조의 containsKey() 시간 복잡도 O(1) 함수를 활용하여 지금 내가 짠 코드의 시간 복잡도 O(nlog n) 보다 더 효율적으로 O(n)으로 푼 풀이를 볼 수 있어서 

중복을 제외한(중요!) 두 배열에서 겹치는 요소를 탐색 할 때는 Mep or Set의 자료구조를 활용해야 겠다.

 

'PS > Level1' 카테고리의 다른 글

자연수를 뒤집어 배열로 만들기  (0) 2023.02.18
크레인 인형뽑기 게임  (0) 2023.02.06
[1차] 다트 게임  (0) 2023.02.02
Programmers School level 1: 실패율  (1) 2023.01.31
Programmers School level 1: [1차] 비밀지도  (1) 2023.01.26

+ Recent posts