개발 기록
[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 };

'알고리즘 & 자료구조 > baekjoon & programmers' 카테고리의 다른 글
| [BAEKJOON] 10872번 팩토리얼(Factorial) - 재귀 (0) | 2024.03.09 |
|---|---|
| [Programmers] 2024 KAKAO WINTER INTERNSHIP - 가장 많이 받는 선물 개수 (0) | 2024.01.22 |
| [Programmers] 2022 KAKAO BLIND RECRUITMENT - 신고 결과 받기 (0) | 2024.01.21 |
| [BAEKJOON] 2575번 N 번째 큰 수 (0) | 2023.11.16 |
| [BAEKJOON] 2581번 소수 구하기 (소수 합, 최소 소수 값) (0) | 2023.09.13 |