알고리즘/프로그래머스

[프로그래머스] 로또의 최고 순위와 최저 순위 for JAVA

정석이 2021. 11. 4. 20:16

 

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

 

코딩테스트 연습 - 로또의 최고 순위와 최저 순위

로또 6/45(이하 '로또'로 표기)는 1부터 45까지의 숫자 중 6개를 찍어서 맞히는 대표적인 복권입니다. 아래는 로또의 순위를 정하는 방식입니다. 1 순위 당첨 내용 1 6개 번호가 모두 일치 2 5개 번호

programmers.co.kr

 

 

문제가 기니 사이트 들어가서 확인부탁

 

 

 

 


 

 

로또번호 배열 lottos[] -> 0~45

당첨번호 배열 win_nums[] -> 1~45, 같은 숫자 x

 

 

출력은 최고순위, 최저순위 순서로 출력한다.

 

 

 

문제를 보면 많이 맞췄을 경우는 0을 다 맞췄을 때, 거의 못맞췄을 경우는 0이 다 틀렸을 때이다.

 

그래서 0을 뺀 로또번호와 당첨번호를 비교해서 맞춘 개수 + 0의 개수가 다 맞춘 경우, 맞춘 개수만 하는게 다 틀렸을 경우이다.

 

 

 

 

 

코드

import java.util.*;
import java.util.Arrays;
class Solution {
    public int[] solution(int[] lottos, int[] win_nums) {
        int[] answer = {0, 0};
        
        
        Arrays.sort(lottos);   // 배열 정렬을 해줬다. 안해도 된다.
        Arrays.sort(win_nums);
        
        int num = 0, zero = 0;
        
        for(int i = 0; i < 6; i++){
            if(lottos[i] == 0) zero++;    // 0의 개수
            for(int j = 0; j < 6; j++)
                if(lottos[i] == win_nums[j]){
                    num++;   // 0을 제외하고 맞춘 개수
                    break;
                }
        }
    
        int high = num + zero;
        int low = num;
        
        answer[0] = rank(high);
        answer[1] = rank(low);
        
        return answer;
                    
    }

    public int rank(int num){  // 맞춘 개수로 보는 등수
        switch(num){
                case 0: return 6;
                case 1: return 6;
                case 2: return 5;
                case 3: return 4;
                case 4: return 3;
                case 5: return 2;
                case 6: return 1;
                default: return 0;
            }
    }
}

 

 

로또가 6개밖에 없어서 그냥 배열 통째로 비교했다.

 

 

 

맞춘 개수로 확인할 등수는 따로 함수화해줬다.

 

 

 

 

프로그래머스로 풀어보는게 처음이라 return answer 부분은 찾아봤다....ㅠㅠ 보통 저렇게 하는구나

 

 

성능

 

 

 

 

 


 

 

 

다른사람의 코드도 살펴보자!

 

 

내가 푼 코드랑 비슷한데 이분은 for each문을 사용해 0이 아닐 때에만 비교하셨다. 호오....

 

 

 

 

 

이분도 for each문을 사용하셨고 map함수를 이용했다. 0이 아닐 때 true로 해주고

 

map함수의 containsKey를 사용하여 map 안에 win_nums의 값이 있는지 확인하고 있으면 sameCount++ 해줬다.

 

 

순위를 매기는 것도., 저렇게 고급지게 표현이 되는구나~~!

 

확실히 boolean을 사용하는게 성능이 좋은 것 같긴 하다...~

 

 

 

 

 

이분은 math함수를 사용했다.

Math.min(7 - max, 6) 이런식으로 7-max 값과 6중에 작은 값을 출력하는 방식을 사용했다.

 

7 - 맞춘값을 하면 등수가 나온다!! 그러네!!

 

거기에 하나도 못맞춰서 7 - 0이면 7등이 나오니까 7, 6중에 작은 값인 6을 출력하도록 했다.!

 

 

 

 

 

남의 코드 보면서 더 배운다~~ 레벨 1인데 얻어갈게 많다.

 

코테도 보통 이걸로 보고... 교수님도 프로그래머스를 추천해주셔서 얘를 우선 다 풀려고 한다.

ide 없이 하는게 어렵구나~ 프로그래머스 문제를 우선 다 풀어야짓!