개발 기록

[Programmers] 2021 Dev-Matching - 로또의 최고 순위와 최저 순위 본문

알고리즘 & 자료구조/baekjoon & programmers

[Programmers] 2021 Dev-Matching - 로또의 최고 순위와 최저 순위

1z 2024. 1. 21. 17:54

 

문제

: 로또의 일부 번호를 알아볼 수 없게 되었을 때, 자신이 구매했던 로또로 당첨이 가능했던 최고 순위와 최저 순위 구하기

 

■ 1. 문제  설명

 

구매한 로또 번호 6개 :  44, 1, 0, 0, 31, 25

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

 

* 순서와 상관없이, 구매한 로또에 당첨 번호와 일치하는 번호가 있으면 맞힌 걸로 인정
<<로또의 순위를 정하는 방식>>
순위 당첨
1등 (6)개번호 일치
2등 (5)개번호 일치
3등 (4)개번호 일치
4등 (3)개번호 일치
5등 (2)개번호 일치
6등 (낙첨) 그 외
▶ int[] lottos = 구매한 로또 번호를 담은 배열
▶ int[] win_nums =  당첨 번호를 담은 배열

 

Solution !  당첨 가능한 최고 순위와 최저 순위를 차례대로 배열에 담아서 return 

 

 


 

■ 2. 문제  풀이

 

(1) 알아볼 수 없는 로또 번호 개수를 구한다.

Map<Integer, Boolean> map = new HashMap<>();
int zeroCount = 0;

// 알아볼수 없는 번호 개수
for (int lotto : lottos) {
    if (lotto == 0) {
        zeroCount++;
        continue;
    }
    // 유효한 번호를 map에 담는다.
    map.put(lotto, true);
    
    // map = {1=true, 25=true, 44=true, 31=true}
}

 

 

(2) 당첨번호와 일치하는 로또 번호 개수를 구한다.

* map 의 value 값을 쓰지 않는 이유는, 애초에 value 값을 쓰기 위해 map에 담은 것이 아니라, 

당첨번호와의 일치여부를 알아보기 위함, 즉 map 의 containsKey() 메서드를 사용하기 위해서이다.

int sameCount = 0;

// 당첨번호와 일치하는 개수 구하기
for (int winNum : win_nums) {
    if (map.containsKey(winNum))
        sameCount++;
}

 

(2-1) 당첨번호와 일치하는 개수 구하는 방법은 여러가지가 있는데, 그중 두 개는 아래와 같다.

 

1.  Array.binarySearch() : 이진탐색을 이용하여 일치 여부 확인

 

2. 이중 for 문: 사용자의 로또번호 한개~ 한개씩 당첨번호와 비교하는 방법

 

 

(3) 최고순위와 최저순위 구하기 

// 알아볼 수 없는 번호가 당첨번호와 같을 경우 등수구하기
int maxRank = 7 - (sameCount + zeroCount);

// 당첨번호와 일치하는 개수로 등수 구하기
int minRank = 7 - sameCount;

// Math.min() : 주어진 숫자들 중 가장 작은 값 반환
// maxRank, minRank 가 6 보다 클 경우 방지
int[] answer = {Math.min(maxRank, 6), Math.min(minRank, 6)};

return answer;

 

 

 

전체 코드

public int[] solution1(int[] lottos, int[] win_nums) {
    // contain
    Map<Integer, Boolean> map = new HashMap<>();
    int zeroCount = 0;

    // 알아볼수 없는 번호 개수
    for (int lotto : lottos) {
        if (lotto == 0) {
            zeroCount++;
            continue;
        }
        // 유효한 번호를 map에 담는다.
        map.put(lotto, true);
    }

    int sameCount = 0;

    // 당첨번호와 일치하는 개수 구하기
    for (int winNum : win_nums) {
        if (map.containsKey(winNum))
            sameCount++;
    }

    // 알아볼 수 없는 번호가 당첨번호와 같을 경우 등수구하기
    int maxRank = 7 - (sameCount + zeroCount);

    // 당첨번호와 일치하는 개수로 등수 구하기
    int minRank = 7 - sameCount;

    // Math.min() 함수는 주어진 숫자들 중 가장 작은 값을 반환
    int[] answer = {Math.min(maxRank, 6), Math.min(minRank, 6)};

    return answer;
}

 

 

결과

int[] lottos = {44, 1, 0, 0, 31, 25};
int[] win_nums = { 31, 10, 45, 1, 6, 19 };