알고리즘/99Club

99클럽 코테 스터디 39일차 TIL + 로또의 최고 순위와 최저 순위 (구현)

dami97 2024. 8. 29. 19:01
반응형

 

 

 

소개

  • 알고리즘 스터디를 참여하며 작성하는 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]

 

 


 

 

문제 접근

  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};
    }
}

풀이 설명

  1. 초기화
    • rankMap을 이용하여 맞힌 개수에 따른 순위를 정의합니다.
  2. 맞힌 개수와 0의 개수 파악
    • lottos 배열에서 0의 개수를 계산합니다.
    • lottos 배열에서 번호가 같은 개수를 구합니다.
  3. 최고와 최저 순위 계산
    • 최고 순위는 sameCount + zeroCount를 이용해 계산하고, 최저 순위는 sameCount를 이용해 계산합니다.
    • 이를 통해 최고 순위와 최저 순위를 배열로 반환합니다.

 

 


 

 

 

마무리하며

이번 문제는 간단한 자료 구조를 활용해 로또 번호의 최고 및 최저 순위를 구하는 문제였습니다.

기본적인 스트림 연산을 활용하여 쉽게 문제를 해결할 수 있었습니다.