본문 바로가기
알고리즘/프로그래머스

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

by KDW999 2023. 2. 25.

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

 

프로그래머스

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

programmers.co.kr

 

문제 접근

먼저 반복문을 돌면서 0의 갯수를 카운팅하고 0을 제외한 나머지 로또 번호들이 당첨 번호와 몇 개나 일치하는지 검사한다.

이후 switch문에서 일치하는 로또 번호 갯수로 현재 등수를 정하고, 앞서 카운팅했던 0의 갯수들 만큼 현재 등수를 올려 최고 순위를 정한다.

순위는 1위가 제일 높기에 최고 순위의 변수인 highRank가 1보다 작아지면 1로 만들어줌

최저 순위는 0들이 로또 번호와 다 달라도 현재 순위와 같기에

최고 순위 highRank와 현재 순위 currentRank를 return

 

class Solution {
    public int[] solution(int[] lottos, int[] win_nums) {
		int zeroCount = 0;
		int sameNumber = 0;
		int highRank;
		int currentRank;

		for (int i = 0; i < lottos.length; i++) {

			if (lottos[i] == 0)	zeroCount++;
			else {
				for (int l : win_nums) {
					if (lottos[i] == l)
						sameNumber++;
				}
			}
		}

		switch (sameNumber) { // 최고 순위
            // 0의 갯수 만큼 등수 올리기
		case 2:
			currentRank = 5;
			highRank = currentRank - zeroCount;
			break;

		case 3:
			currentRank = 4;
			highRank = currentRank - zeroCount;
			break;

		case 4:
			currentRank = 3;
			highRank = currentRank - zeroCount;
			break;

		case 5:
			currentRank = 2;
			highRank = currentRank - zeroCount;
			break;

		case 6:
			currentRank = 1;
			highRank = currentRank - zeroCount;
			break;

		default:
			currentRank = 6;
			highRank = currentRank - zeroCount;
		}
        if(highRank < 1) highRank = 1;

		int[] answer = { highRank, currentRank };
		return answer;
 }
}

 

다른 사람 풀이

1)

이 분은 Map을 활용하여 0이 아닌 로또 번호들을 Map에다 저장하고 containsKey()로 Map에 담아둔 로또 번호들이 당첨 번호와 같을 경우로 당첨된 번호의 갯수를 카운팅 하였다.

import java.util.HashMap;
import java.util.Map;

class Solution {
    public int[] solution(int[] lottos, int[] win_nums) {
        Map<Integer, Boolean> map = new HashMap<Integer, Boolean>();
        int zeroCount = 0;

        for(int lotto : lottos) {
            if(lotto == 0) {
                zeroCount++;
                continue;
            }
            map.put(lotto, true);
        }


        int sameCount = 0;
        for(int winNum : win_nums) {
            if(map.containsKey(winNum)) sameCount++;
        }

        int maxRank = 7 - (sameCount + zeroCount);
        int minRank = 7 - sameCount;
        if(maxRank > 6) maxRank = 6;
        if(minRank > 6) minRank = 6;

        return new int[] {maxRank, minRank};
    }
}

 

2)

따로 switch를 계산하는 메서드를 활용한 방법 

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

        int cnt1 = 0;
        int cnt2 = 0;
        for(int i : lottos) {
            if(i == 0) {
                cnt1++;
                continue;
            }
            for(int j : win_nums) {
                if(i == j) cnt2++;
            }
        }


        answer[0] = getGrade(cnt1+cnt2);
        answer[1] = getGrade(cnt2);

        return answer;
    }

    public int getGrade(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;
        }
    }
}

댓글