티스토리 뷰

이번에는 나름 레벨업을 해 보고자 stream을 적극 사용하고자 하였다.

 

먼저 접근 전략은

1. 최저로 맞힌 갯수 는 0의 여부와는 상관없으니, 기존에 있는 숫자들로 계산한다.

2. 최고로 맞힌 갯수는  0이 무조건 맞는 숫자인 경우라고 생각하면 되니까, 최저 등수에 0의 갯수를 더해준다.

3. 7에서 맞힌 갯수를 빼면 등수가 나오는데 다 틀린 경우, 즉 맞힌 갯수가 0이어서 7이 될때도 6등이 되어야 하니 이 부분만 따로 예외 처리를 해 준다. 

 

stream을 0의 갯수를 찾을 때 사용해 봤는데, 확실히 for문 쓰는 것 보다야 코드가 간결해 지는 것 같다.

 

먼저 0의 갯수를 cnt라고 하고, lottos를 리스트로 변환한다.

그리고 lottos와 win_nums를 비교해서 같은 숫자가 있는지를 보는 것이다.

 

lottoList의 stream을 생성하고,

int cnt = lottosList.stream()

.filter와 람다를 통해 겹치는 숫자가 있는 지를 걸러낸다.

int cnt = lottosList.stream().filter(num -> num.equals(i))

그리고 count()라는 종결함수를 통해 겹치는 숫자의 갯수를 세어준다. 다만 count의 반환타입은 long이어서 int로 강제 형변환을 해 준다.

int cnt = (int) lottosList.stream().filter(num -> num.equals(i)).count();

 

#풀이 코드

import java.util.*;
class Solution {
    public int[] solution(int[] lottos, int[] win_nums) {
       
// ㅣlottos 리스트로 변환
        List<Integer> lottosList = new ArrayList<>();

        for (int i = 0; i < lottos.length; i++) {
            lottosList.add(lottos[i]);
        }
//      0 여부와 상관없이 현재 있는 값들을 이용해서 최저 순위 계산.
        int min = 0;
        for (int i : win_nums){
            int cnt = (int) lottosList.stream().filter(num -> num.equals(i)).count();
            min += cnt;
        }


//      0이 다 맞으면 최고 순위.

        int max = min;
        for (int i : lottos){
            if (i == 0){
                max++;
            }
        }

        int[] answerArr = {max, min};
        int[] answer = {7-max, 7-min};
 		
        if (7-max == 7){
            answer[0] = 6;
        }

        if (7-min == 7){
            answer[1] = 6;
        }
       
        return answer;
    }
}
댓글