2021년 8월 3일 화요일

[ Algorithm ] 로또의 최고 순위와 최저 순위


문제 ]

특정조건일때 각기다른 2개의 배열이 같은 값은 몇개 가지는지를

비교하는 문제


https://programmers.co.kr/learn/courses/30/lessons/77484


순위 당첨 내용

1 6개 번호가 모두 일치

2 5개 번호가 일치

3 4개 번호가 일치

4 3개 번호가 일치

5 2개 번호가 일치

6(낙첨) 그 외

구매했던 로또로 당첨이 가능했던 최고 순위와 최저 순위를 알아보고 싶어 졌습니다.

알아볼 수 없는 번호를 0으로 표기하기로 하고, 구매한 로또 번호 6개가 44, 1, 0, 0, 31 25라고 가정해보겠습니다. 당첨 번호 6개가 31, 10, 45, 1, 6, 19라면, 당첨 가능한 최고 순위와 최저 순위의 한 예는 아래와 같습니다.


로또 당첨 번호        31 10          45 1 6         19 결과

최고 순위 번호 31 0→10  44 1 0→6 25 4개 번호 일치, 3등

최저 순위 번호 31 0→11  44 1 0→7 25 2개 번호 일치, 5등


순서와 상관없이, 구매한 로또에 당첨 번호와 일치하는 번호가 있으면 맞힌 걸로 인정됩니다.

구매한 로또 번호를 담은 배열 lottos, 당첨 번호를 담은 배열 win_nums가 매개변수로 주어집니다. 이때, 당첨 가능한 최고 순위와 최저 순위를 차례대로 배열에 담아서 return 하도록 solution 함수를 완성해주세요.


제한사항

lottos는 길이 6인 정수 배열입니다.

lottos의 모든 원소는 0 이상 45 이하인 정수입니다.

0은 알아볼 수 없는 숫자를 의미합니다.

0을 제외한 다른 숫자들은 lottos에 2개 이상 담겨있지 않습니다.

lottos의 원소들은 정렬되어 있지 않을 수도 있습니다.

win_nums은 길이 6인 정수 배열입니다.

win_nums의 모든 원소는 1 이상 45 이하인 정수입니다.

win_nums에는 같은 숫자가 2개 이상 담겨있지 않습니다.

win_nums의 원소들은 정렬되어 있지 않을 수도 있습니다.


입출력 예

lottos win_nums result

[44, 1, 0, 0, 31, 25] [31, 10, 45, 1, 6, 19] [3, 5]

[0, 0, 0, 0, 0, 0] [38, 19, 20, 40, 15, 25] [1, 6]

[45, 4, 35, 20, 3, 9] [20, 9, 3, 45, 4, 35] [1, 1]




제출 ] 


import java.util.*;
import java.util.stream.IntStream;
import java.util.stream.Collectors;
import java.util.Iterator;

class Solution {
    public int[] solution(int[] lottos, int[] win_nums) {

        int[] answer = {7,7};
        Iterator<Integer> iter = 
            Arrays.stream(lottos).boxed().collect(Collectors.toList()).iterator();
        
        while (iter.hasNext()) {
            int tmp = iter.next();
            if(IntStream.of(win_nums).anyMatch(x -> x == tmp)){
                answer[0]--;
                answer[1]--;
            }
            if(tmp == 0) answer[0]--;
        }
        
        if(answer[0]==7) answer[0] = 6;
        if(answer[1]==7) answer[1] = 6;
        return answer;
    }
}



풀이 ]

int[] answer = { 최고순위, 최저순위 } 로 7,7로 시작해 

lottos의 배열 값이 win_nums배열에 있으며 최고순위, 최저순위 각 -1씩

lottos의 배열 값이 0 이면 최고순위 -1씩 하여 반환한다. 

Ex) 5개가 맞으면 7 - 5 = 2, 즉 2등



다른 사람 풀이 ]

import java.util.Arrays;
import java.util.stream.LongStream;

class Solution {
    public int[] solution(int[] lottos, int[] winNums) {

        return LongStream.of(
            (lottos.length + 1) - Arrays.stream(lottos)
            .filter(l -> Arrays.stream(winNums).anyMatch(w -> w == l) || l == 0)
            .count(),
            (lottos.length + 1) - Arrays.stream(lottos)
            .filter(l -> Arrays.stream(winNums).anyMatch(w -> w == l))
            .count()
        ).mapToInt(op -> (int) (op > 6 ? op - 1 : op)).toArray();

    }
}


람다식으로 표현

return Stream.of( 최고순위, 최저순위).(리턴값 7일 경우 예외처리)



댓글 없음:

댓글 쓰기