주노 님의 블로그

프로그래머스 - 로또의 최고순위와 최저순위 (java) 본문

공부/코딩테스트(java)

프로그래머스 - 로또의 최고순위와 최저순위 (java)

juno0432 2024. 7. 29. 12:00

금요일 밤

어떤 지나가던 나그네님이 61번 로또의 최고순위와 최저순위를 구하는 문제를 어려워 하셨다 동적할당?? 으로 푼다는데

그래서 튜터님 잠깐 기다리는동안 풀어봤다

민우 동생은 왜 지웠노 이걸

 

 

위 내용만 보면 된다.

다른 번호는 나중에 계산하고. 최고순위일때는 지워진 숫자를 모두 당첨

최저순위일때는 지워진 숫자를 모두 꽝 으로 보면되는것이다

arraylist를 쓸 이유가 없는디..?

 

class Solution {
    public int[] solution(int[] lottos, int[] win_nums) {
        int[] answer = new int [2];
        int countMax = 0;
        int countMin = 0;

        for(int i=0;i<lottos.length;i++)
        {
            if(lottos[i]==0)
            {
                countMax++;
            }
            else
            {
                for(int j=0; j<win_nums.length; j++)
                {
                    if(lottos[i] == win_nums[j])
                    {
                        countMax++;
                        countMin++;
                    }
                }
            }
        }
        answer[0]=rank(countMax);
        answer[1]=rank(countMin);
        
        return answer;
    }

    private int rank(int count)
    {
        switch (count)
        {
            case 6:
                return 1;
            case 5 :
                return 2;
            case 4 :
                return 3;
            case 3 :
                return 4;
            case 2 :
                return 5;
            default:
                return 6;
        }
    }
}

 

카운트를 두개를 둔다 하나는 최고순위, 하나는 최저순위

 

구현한 코드이다

만약 0(지워진 상태)라면 그건 최고순위에 카운터해준다 (무조건 정답)

그다음 반복문으로

로또 i가 정답 j랑 같다면

둘다 플러스를 해준다. (나머지 지워지지않은 값은 그대로 카운트해야하니까)

 

그리고 rank 메서드를 만들어 체크를 해준다

 

뭔가 for이 두개들어가면 일단 비효율적이진 않을까 고민하게된다

 



import java.util.HashSet;
import java.util.Set;

class Solution {
    public int[] solution(int[] lottos, int[] win_nums) {
        Set<Integer> winNumsSet = new HashSet<>();
        //당첨 번호를 해시셋에 넣는다
        for (int win_num : win_nums) {
            winNumsSet.add(win_num);
        }

        int countMax = 0;
        int countMin = 0;
        
        for (int lotto : lottos) {
            if (lotto == 0) {
                countMax++;
            } else if (winNumsSet.contains(lotto)) {
                countMax++;
                countMin++;
            }
        }
        
        int[] answer = new int[2];
        answer[0] = rank(countMax);
        answer[1] = rank(countMin);
        return answer;
    }

    private int rank(int count) {
        switch (count) {
            case 6: return 1;
            case 5: return 2;
            case 4: return 3;
            case 3: return 4;
            case 2: return 5;
            default: return 6;
        }
    }
}

 

챗지피티한테 물어봤다

내 코드는 해당 번호가 당첨 번호와 매칭시키기 위해서 for문을 한번 더썼지만

set클래스에서는 contains메서드를 이용하면 굳이 돌지않아도 바로 찾을수 있다는것..

 

물론 set은 순서를 보장하지않기때문에 조심해야한다