코딩 테스트/프로그래머스

프로그래머스 - 로또의 최고 순위와 최저 순위 문제 (자바)

programmers.co.kr/learn/courses/30/lessons/77484

 

코딩테스트 연습 - 로또의 최고 순위와 최저 순위

로또 6/45(이하 '로또'로 표기)는 1부터 45까지의 숫자 중 6개를 찍어서 맞히는 대표적인 복권입니다. 아래는 로또의 순위를 정하는 방식입니다. 1 순위 당첨 내용 1 6개 번호가 모두 일치 2 5개 번호

programmers.co.kr

최고는 알아볼 수 없게 된 수가 모두 유효한 경우이고

최저는 알아 볼 수 없게 된 수가 모두 유효하지 않은 경우 이므로

lottos와 win_num의 같은 수의 개수 구하고

lottos에 알아볼 수 없게 된 숫자의 수의 개수를 구하여서

 

최고는 두 개수의 합

최저는 같은 경우의 개수로 등수를 구하면 된다.

 

ps

로또의 범위가 45까지이므로 시간 복잡도에 민감하게 풀지않아도 되지만

같은 수의 개수를 구할때 이중 for문을 사용하는 것 보다

boolean 배열을 만들어서 처리하는 것이 시간복잡도면에서 더 좋은 코드이다.

class Solution {
    public int[] solution(int[] lottos, int[] win_nums) {
        int zeroCount = 0;
        int sameCount = 0;
        boolean[] num_counts = new boolean[46];
        
        // 45 중 당첨 번호에 포함되는 경우 true로 설정
        for(int i = 0; i < win_nums.length; i++) {
            num_counts[win_nums[i]] = true;
        }
        
        // 구매한 로또 번호를 순회
        for(int i = 0; i < lottos.length; i ++) {
            // 지어진 경우
            if(lottos[i] == 0) {
                zeroCount++;
                continue;
            }
            
            // 로또 번호와 당첨번호와 같은 경우
            if(num_counts[lottos[i]]) {
                num_counts[lottos[i]] = false;
                sameCount++;
            }
        }
        
        int[] answer = {getRank(zeroCount+sameCount), getRank(sameCount)};
        return answer;
    }
    
    // 맞은 갯수에 따른 순위 리턴 메서드
    static int getRank(int count) {
        if(count == 0) return 6;
        return 7 - count;
    }
}