소스코드는 Github에서도 확인하실 수 있습니다.
[프로그래머스] 로또의 최고 순위와 최저 순위 Java
풀이 🚀
- 지워진 번호(알 수 없는 번호)를 0으로 표기한다.
- 순위를 매기는 기준은 다음 표와 같다.
순위 | 당첨 내용 |
1 | 6개 번호가 모두 일치 |
2 | 5개 번호가 일치 |
3 | 4개 번호가 일치 |
4 | 3개 번호가 일치 |
5 | 2개 번호가 일치 |
6(낙첨) | 그 외 |
구매한 로또 번호가 [44, 1, 0, 0, 31, 25]이고, 당첨 번호가 [31, 10, 45, 1, 6, 19] 인 경우, 당첨될 수 있는 최고 순위와 최저 순위는 몇 위일까?
우선 구매한 로또 번호에서 알 수 없는 번호인 0의 개수를 센다.
- 만약 0의 개수가 로또 번호의 총 개수와 같다면, 모든 번호를 알아볼 수 없다는 의미이니 최고 1등, 최저 6등(낙첨)까지 가능하다.
당첨 번호를 순회하며 로또 번호에 당첨 번호와 일치하는 번호가 있는지 개수를 센다. 이 개수는 무조건 당첨되는 최저 순위를 나타낸다. (why? 알 수 없는 번호인 0이 모두 당첨 번호가 아니더라도 당첨 번호와 일치하는 번호들이기 때문!)
따라서 최저 순위는 로또 번호에 당첨 번호와 일치하는 번호의 개수를 통해 계산할 수 있으며,
최고 순위는 알 수 없는 번호인 0의 개수를 최저 순위를 구할 때 계산해 둔 로또 번호에 당첨 번호와 일치하는 번호의 개수에 더함으로서 계산할 수 있다.
알고리즘 풀이 과정을 적으면서 느끼는 거지만 내 머릿속의 풀이 과정을 글로 옮기는 것은 매우 어려운 일인 것 같다. 😞
소스코드 👩🏻💻
import java.util.*;
class Solution {
public int[] solution(int[] lottos, int[] win_nums) {
int[] answer = new int[]{1, 6}; // 모두 0인 경우를 default로 둔다.
List<Integer> lottoList = new ArrayList<>();
for (int lotto : lottos) {
lottoList.add(lotto);
}
final int size = lottoList.size();
final int zeros = Collections.frequency(lottoList, 0);
if (zeros == size) {
return answer;
}
int lowestRank = 0;
for (int win_num : win_nums) {
if (lottoList.contains(win_num)) { // 우승 번호를 갖고 있다면
lowestRank += 1;
}
}
final int highestRank = zeros + lowestRank;
answer[0] = convertToRank(highestRank);
answer[1] = convertToRank(lowestRank);
return answer;
}
private int convertToRank(final int counts) {
if (counts == 1 || counts == 0) {
return 6;
}
return 7 - counts;
}
}