2 minute read



제한사항

  1. lottos는 길이 6인 정수 배열입니다.
  2. lottos의 모든 원소는 0 이상 45 이하인 정수입니다.
  3. 0은 알아볼 수 없는 숫자를 의미합니다.
  4. 0을 제외한 다른 숫자들은 lottos에 2개 이상 담겨있지 않습니다.
  5. lottos의 원소들은 정렬되어 있지 않을 수도 있습니다.
  6. win_nums은 길이 6인 정수 배열입니다.
  7. win_nums의 모든 원소는 1 이상 45 이하인 정수입니다.
  8. win_nums에는 같은 숫자가 2개 이상 담겨있지 않습니다.
  9. 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;
        }
    }
}

회고

  • 최소 한개의 요소가 존재함을 검증해주는 스트림의 매칭 메서드를 통해 로또 배열에서 당첨 번호가 몇개나 있는지를 쉽게 알 수 있었다.