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

728x90

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

 

https://school.programmers.co.kr/learn/courses/30/lessons/77484

 

프로그래머스

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

programmers.co.kr

 

접근

최대한 많이 맞히는 경우와 최대한 적게 맞히는 경우에 대해서 생각해 보았다.

최대한 많이 맞히려면, 0으로 들어온 값은 반드시 당첨 번호로 카운트를 해줘야 하며,

최대한 적게 맞히려면, 0으로 들어온 값은 반드시 틀린 번호이므로 카운트 하지 않아야 한다.

 

당첨 번호의 기준은 순서 상관 없이 번호만 일치하면 되기 때문에 해시맵을 사용해서 민우의 당첨 번호가 실제 당첨 번호와 중복 되는 것이 있는지 확인하는 방법으로 카운트를 할 수 있었다.

 

import java.util.*;
class Solution {
    public int[] solution(int[] lottos, int[] win_nums) {
        int[] answer = new int[2];
        HashMap<Integer, Integer> map = new HashMap<>();
        
        int zeroCnt = 0, rightNum = 0;
        for (int i: lottos) {
            if (i == 0) {
                zeroCnt++;
            }
            else map.put(i, map.getOrDefault(i, 0) + 1);
        }
        
        for (int i: win_nums) {
            map.put(i, map.getOrDefault(i, 0) + 1);
            if (map.get(i) == 2) {
                rightNum++;
            }
        }
        answer[0] = rightNum+zeroCnt >= 2 ? 6 - (zeroCnt + rightNum) + 1 : 6;
        answer[1] = rightNum >= 2 ? 6 - rightNum + 1 : 6;
        return answer;
    }
}

 

zeroCnt는 민우가 고른 번호 중에 0이 몇 개 있는지 카운트 하는 변수이며, 

rightNum은 민우가 고른 번호가 당첨 번호와 일치하는 것이 몇 개가 있는지 카운트 하는 변수이다.

 

순위당첨 내용

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

위의 표를 기준으로 최대 등수와 최저 등수를 구해야 했다.

최대 등수의 경우 0의 횟수와 일치하는 번호 수를 합한 값이 최대로 맞히는 수이므로, 6 - (zeroCnt + rightNum) + 1로 등수를 구했다.

최저 등수의 경우 0의 횟수를 무시하므로 일치하는 번호 수만 이용하여 6 - rightNum + 1로 등수를 구할 수 있었다.

 

다만, 아래의 테스트 케이스에서 문제가 생길 수 있다.

[1, 2, 3, 4, 5, 6], [7, 8, 9, 10, 11, 12] -> [6, 6]

0이 없으므로 zeroCnt = 0, 맞는 숫자도 없으니 rightNum = 0이다.

이럴 경우, 최대 등수 최저 등수 모두 반드시 6등이 나올 수 밖에 없다.

 

위의 공식은 1~5등 까지의 등수만 구할 수 있으므로 6등의 등수를 구하기 위해 조건을 작성해야 했다.

answer[0] = rightNum+zeroCnt >= 2 ? 6 - (zeroCnt + rightNum) + 1 : 6;
answer[1] = rightNum >= 2 ? 6 - rightNum + 1 : 6;
return answer;

최대 등수는 앞에서 얘기했듯, 0과 맞은 숫자의 합이 전체 맞은 횟수가 되므로 그 합이 2개 미만으로 되는 경우 6등을 부여했다.

최소 등수는 0의 개수를 무시하므로, 맞은 숫자의 횟수가 2개 미만이 되는 경우 6등을 부여했다.

 

 

전체 코드

import java.util.*;
class Solution {
    public int[] solution(int[] lottos, int[] win_nums) {
        int[] answer = new int[2];
        HashMap<Integer, Integer> map = new HashMap<>();
        
        int zeroCnt = 0, rightNum = 0;
        for (int i: lottos) {
            if (i == 0) {
                zeroCnt++;
            }
            else map.put(i, map.getOrDefault(i, 0) + 1);
        }
        
        for (int i: win_nums) {
            map.put(i, map.getOrDefault(i, 0) + 1);
            if (map.get(i) == 2) {
                rightNum++;
            }
        }
        answer[0] = rightNum+zeroCnt >= 2 ? 6 - (zeroCnt + rightNum) + 1 : 6;
        answer[1] = rightNum >= 2 ? 6 - rightNum + 1 : 6;
        return answer;
    }
}
728x90