반응형
소개
- 알고리즘 스터디를 참여하며 작성하는 TIL입니다.
- TIL이란? 'Today I Learned'의 약자로, 한국어로 번역하면 '오늘 내가 배운 것'이란 의미입니다.
- 제가 오늘 하루 배운 것 혹은 경험하고 느낀 것들을 기록하고 회고하는 습관을 기르기 위한 글입니다.
문제 & 키워드
- 프로그래머스 - 로또의 최고 순위와 최저 순위 (문제 링크)
- 구현
문제 설명
로또 6/45는 1부터 45까지의 숫자 중 6개를 찍어서 맞히는 복권입니다. 각 번호가 모두 일치하는 경우 1등, 5개 일치 시 2등, 4개 일치 시 3등, 3개 일치 시 4등, 2개 일치 시 5등, 그 외는 낙첨(6등)입니다.
민우는 로또 번호를 구매했지만, 동생이 실수로 번호를 알아볼 수 없게 만들어 일부 번호는 '0'으로 표시되었습니다. '0'은 어떤 숫자로도 변환할 수 있기 때문에, 민우는 최고 순위와 최저 순위를 계산해보려 합니다.
주어진 번호와 당첨 번호를 비교하여 민우가 받을 수 있는 최고 순위와 최저 순위를 구하는 문제입니다.
제한사항
- lottos는 길이 6인 정수 배열입니다.
- lottos의 원소는 0 이상 45 이하의 정수입니다.
- win_nums는 길이 6인 정수 배열이며, 1 이상 45 이하의 숫자들이 포함됩니다.
- lottos와 win_nums에 중복된 숫자는 없습니다.
입출력 예
예제 1
lottos = [44, 1, 0, 0, 31, 25]
win_nums = [31, 10, 45, 1, 6, 19]
result = [3, 5]
예제 2
lottos = [0, 0, 0, 0, 0, 0]
win_nums = [38, 19, 20, 40, 15, 25]
result = [1, 6]
예제 3
lottos = [45, 4, 35, 20, 3, 9]
win_nums = [20, 9, 3, 45, 4, 35]
result = [1, 1]
문제 접근
- 문제 이해
- 0은 어떤 숫자와도 일치할 수 있기 때문에, 0의 개수를 파악하고, 이를 통해 최고와 최저 순위를 계산하면 됩니다.
- 배열의 서로 같은 값의 개수는 최저 순위, 같은 개수에 0의 개수를 더하면 최고 개수를 쉽게 구할 수 있습니다.
풀이 - Java 코드
import java.util.Arrays;
import java.util.Map;
class Solution {
private Map<Integer, Integer> rankMap = Map.of(
0, 6,
1, 6,
2, 5,
3, 4,
4, 3,
5, 2,
6, 1
);
public int[] solution(int[] lottos, int[] win_nums) {
int zeroCount = (int) Arrays.stream(lottos)
.filter(value -> value == 0)
.count();
int sameCount = (int) Arrays.stream(lottos)
.filter(
lottoNum ->
Arrays.stream(win_nums).anyMatch(winNum -> winNum == lottoNum)
)
.count();
int lowestRanking = rankMap.get(sameCount);
int highestRanking = rankMap.get(sameCount + zeroCount);
return new int[]{highestRanking, lowestRanking};
}
}
풀이 설명
- 초기화
- rankMap을 이용하여 맞힌 개수에 따른 순위를 정의합니다.
- 맞힌 개수와 0의 개수 파악
- lottos 배열에서 0의 개수를 계산합니다.
- lottos 배열에서 번호가 같은 개수를 구합니다.
- 최고와 최저 순위 계산
- 최고 순위는 sameCount + zeroCount를 이용해 계산하고, 최저 순위는 sameCount를 이용해 계산합니다.
- 이를 통해 최고 순위와 최저 순위를 배열로 반환합니다.
마무리하며
이번 문제는 간단한 자료 구조를 활용해 로또 번호의 최고 및 최저 순위를 구하는 문제였습니다.
기본적인 스트림 연산을 활용하여 쉽게 문제를 해결할 수 있었습니다.
반응형