본문 바로가기

[IT] 코딩테스트/[문제 및 풀이] 프로그래머스

[프로그래머스] 로또의 최고 순위와 최저 순위 / 자바(Java)

728x90

문제

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

 

프로그래머스

코드 중심의 개발자 채용. 스택 기반의 포지션 매칭. 프로그래머스의 개발자 맞춤형 프로필을 등록하고, 나와 기술 궁합이 잘 맞는 기업들을 매칭 받으세요.

programmers.co.kr

 


해설

로또 번호를 맞추는, 두 배열간에 중복되는 숫자의 개수를 구하는 간단한 문제이지만 0으로 표시되는 지워진 숫자가 있어 생각할 거리가 있었습니다. 최저순위번호는 이 숫자들이 모두 틀렸을 때, 최고순위번호는 모두 맞았을 때 이므로 최저순위번호에 0의 개수를 더하면 최고순위번호의 맞춘 숫자의 수 임을 알 수 있습니다.

문제에 있는 예시 1번입니다.

당첨 번호 31 10 45 1 6 19 결과
소유 번호 31 0 44 1 0 25 *
최고순위번호 31 10 44 1 6 25 4개 -> 3등
최저순위번호 31 * 44 1 * 25 2개 -> 5등

 

아이디어를 코드화 하기 쉽게 여러 단계로 나누어 표현하겠습니다.

  1. 소유 번호를 찾기 쉬운 형태로 변형하기
  2. 당첨 번호와 비교하여 맞춘 숫자의 개수 구하기
  3. 맞춘 숫자의 개수를 등수로 변형하기

1번, 소유번호를 찾기 위해 Set 자료구조를 사용하여도 좋지만 1~45까지의 제한된 숫자이기 때문에 탐색이 빠른 배열을 통해 소유번호를 index로 하고 해당 위치의 값을 true로 하는 boolean 배열을 구성합니다. 이때 0으로 지워진 숫자들의 개수를 따로 계산합니다.(joker)

2번, 당첨 번호 배열을 따라가며 소유번호와 중복되는 숫자의 수를 구합니다. 이 값이 최저순위번호를 맞춘 수(win_counter)가 됩니다.

3번, 1등이 6개, 2등이 5개, 3등이 4개, ... 5등이 2개, 6등이 1개를 맞췄을 때 임으로 이렇게 변환하는 함수를 만들어 해결했습니다.


코드

import java.util.*;
class Solution {
    public int[] solution(int[] lottos, int[] win_nums) {
        int[] answer = {};
        boolean[] checker = new boolean[46];
        int joker = 0, win_counter=0;
        for(int lotto : lottos){
            if(lotto==0)joker++; 
            checker[lotto] = true;
        }
        
        for(int win_num : win_nums){
            if(checker[win_num])win_counter++;
        }
        answer = new int[] {win_numToRank(win_counter+joker), 
                            win_numToRank(win_counter)};
        return answer;
    }
    
    public int win_numToRank(int win_num){
        if(win_num<=1)return 6;
        return 7-win_num;
    }
}
728x90