[Java] 프로그래머스(level-1) - 로또의 최고 순위와 최저 순위

제한사항
- lottos는 길이 6인 정수 배열입니다.
- lottos의 모든 원소는 0 이상 45 이하인 정수입니다.
- 0은 알아볼 수 없는 숫자를 의미합니다.
- 0을 제외한 다른 숫자들은 lottos에 2개 이상 담겨있지 않습니다.
- lottos의 원소들은 정렬되어 있지 않을 수도 있습니다.
- win_nums은 길이 6인 정수 배열입니다.
- win_nums의 모든 원소는 1 이상 45 이하인 정수입니다.
- win_nums에는 같은 숫자가 2개 이상 담겨있지 않습니다.
- win_nums의 원소들은 정렬되어 있지 않을 수도 있습니다.
입출력 예시
Input-1
lottos = [44, 1, 0, 0, 31, 25]
win_numbers = [31, 10, 45, 1, 6, 19]
Output-1
[3, 5]
Input-2
lottos = [0, 0, 0, 0, 0, 0]
win_numbers = [38, 19, 20, 40, 15, 25]
Output-2
[1, 6]
Input-3
lottos = [45, 4, 35, 20, 3, 9]
win_numbers = [20, 9, 3, 45, 4, 35]
Output-3
[1, 1]
문제 풀이
로또의 당첨번호가 담긴 배열(win_numbers)에서 민우가 구매한 로또 번호 배열(lottos) 중 지워진 번호 즉, 0의 개수가 중요하다.
먼저 로또 번호 배열에서 당첨된 번호가 있는지 확인해야 한다.
win_nums 배열을 순회하며 lottos에서 당첨된 번호가 있는지 IntStream의 anyMatch() 메서드를 통해 확인해보자.
1
2
3
for(int win : win_nums) {
if(IntStream.of(lottos).anyMatch(x -> x == win)) min++;
}
lottos 배열에서 당첨된 번호를 찾을 때 min을 증가시킨다.
IntStream
자바8부터 지원하는 Stream으로 컬렉션, 배열의 요소들을 하나씩 참조하여 반복적인 처리를 가능케 하는 기능이다.
Stream 중에서 IntStream은 int형 데이터를 스트림으로 다룰 수 있게 해준다.
매칭 메서드 anyMatch()
최소 한 개의 요소가 주어진 조건을 충족하는지 여부를 알 수 있다.
1
2
3
4
5
for(int lotto : lottos) {
if(lotto == 0) max++;
}
max += min;
다음으로 lottos 배열에서 0(지워진 번호)일 때 max를 증가시킨다.
min은 민우의 로또에서 당첨된 번호만을 세었기 때문에 최저 순위이고,
0일 떄마다 증가시킨 max에 min을 더한다면 지워진 번호만큼 맞춘 갯수가 늘어나기에 최고 순위를 달성할 수 있다.
작성 코드
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
import java.util.*;
import java.util.stream.IntStream;
class Solution {
public static void main(String[] args) {
int[] lottos = {44,1,0,0,31,25};
int[] win_nums = {31,10,45,1,6,19};
long start = System.currentTimeMillis();
solution(lottos, win_nums);
long end = System.currentTimeMillis();
System.out.println("\n수행시간 = " + (end-start));
}
public static int[] solution(int[] lottos, int[] win_nums) {
Arrays.sort(win_nums);
Arrays.sort(lottos);
int max = 0;
int min = 0;
int max_rs = 0;
int min_rs = 0;
for(int win : win_nums) {
if(IntStream.of(lottos).anyMatch(x -> x == win)) min++;
}
for(int lotto : lottos) {
if(lotto == 0) max++;
}
max += min;
max_rs = getResult(max);
min_rs = getResult(min);
int[] answer = {max_rs, min_rs};
return answer;
}
public static int getResult(int n) {
switch(n) {
case 6:
return 1;
case 5:
return 2;
case 4:
return 3;
case 3:
return 4;
case 2:
return 5;
default:
return 6;
}
}
}
회고
- 최소 한개의 요소가 존재함을 검증해주는 스트림의 매칭 메서드를 통해 로또 배열에서 당첨 번호가 몇개나 있는지를 쉽게 알 수 있었다.