본문 바로가기
JAVASCRIPT/코딩테스트

프로그래머스 레벨1 - 로또의 최고 순위와 최저 순위(자바)

by 진짠 2023. 2. 15.
728x90

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

 

프로그래머스

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

programmers.co.kr

문제

 

각 배열의 값을 비교하면서 일치하는 번호가 있다면 최솟값 min, 최댓값 max 두 변수를 증가시켜야 겠다는 생각을 했다.

 

그리고 0인 값, 지워진 번호가 있다면 최댓값 max만 증가시키면 된다. 최고 등수를 맞히려면 0인 수는 무조건 당첨 번호여야 하기 때문이다.

 

그렇게 해서 당첨번호와 일치하는 개수를 구하고 나면 맞힌 개수에 따른 당첨 순위를 구현하면 된다.

 

그리고 배열의 각 값들을 직관적으로 관리하기 위해 map함수를 사용했다.

 

제한사항

체크하고 넘어갈 것은 로또 배열의 길이는 무조건 6개.

 

번호는 0부터 45까지인데 0인 경우는 번호를 알아볼 수 없는 경우에만 해당한다. 

 

그리고 0을 제외한 수는 중복해서 들어가지도 않는다.

 

import java.util.*;
class Solution {
    public int[] solution(int[] lottos, int[] win_nums) {
        int[] answer = new int[2]; //당첨된 번호의 개수의 최댓값, 최소값을 넣는 배열 answer
        int min = 0;
        int max = 0;
        Map<Integer, Integer> win = new HashMap<>();
        for(int j=0;j<win_nums.length;j++) {
            win.put(j, win_nums[j]); //당첨번호의 인덱스와 번호를 map에 넣어준다.
        }
        for(int i=0;i<lottos.length;i++) {
            if(lottos[i] == 0) { //번호가 0이면
                max++; //최대값은 무조건 카운트
            } else {
                for(int k=0;k<win.size();k++) {
                if(win.get(k) == lottos[i]) { //번호가 당첨번호와 일치하면
                    min++; //최대값, 최소값 모두 카운트
                    max++;
                }
                }    
            }
        }
        answer[0] = grade(max); //당첨된 개수에 따라 로또 등수를 리턴시키는 함수 grade
        answer[1] = grade(min);

        
        return answer;
    }
    
    private int grade(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;      
        }
    }
}

먼저 인덱스 순서에 맞춰 각 값들을 가져오기 위해서 map을 이용해 해당 인덱스와 당첨번호를 put시켜주었다.

 

그리고 입력한 번호와 당첨 번호를 구하기 위해 두번의 for문을 돌려서 일치할 경우 카운트를 증가시켰다.

 

최대값의 경우는 0을 입력받았을 때 추가로 카운트를 증가시켰다.

 

구한 당첨번호와 일치하는 숫자의 개수 최댓값, 최솟값은 swith/case문을 이용해 당첨순위를 리턴시키는 함수 grade()에 입력시켜 당첨순위를 구한다.

 

비교

문제만 보면 어려워 보일 것 같고 이해가 힘들어 보이지만 막상 이해하고 나면 크게 어려운 것은 없었다.

 

특별히 어떤 함수를 사용해야 하는 것 없이(굳이 있다면 map..?) 기본적인 코딩으로도 구현이 가능했다.

 

다른 사람의 풀이를 보며 짚고 넘어간 것은,

 

맵에 키 값이 있는지 확인하는 containsKey() 함수를 이용해 당첨번호가 일치하는지 확인인 가능했다.

 

그리고 향상된 for문을 사용하여 좀 더 깨끗하게 for문을 입력할 수 있다.

 

 향상된 for문?
배열과 같이 여러 원소로 이루어진 집합의 모든 원소에 대해 특정 작업을 반복하기 위해 사용하는 for문으로,
1.간편한,가독성 좋은 코드를 짤 수 있고
2. 배열 인덱스 문제 해결이 가능한 (ArrayIndexOutOfBoundsException 예외를 피할 수 있다.)
장점이 있다.

 

728x90

댓글