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

반응형

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

[문제]

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

 

프로그래머스

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

programmers.co.kr

 

[풀이]

문제를 해석하면 다음과 같다

  1. 주어진 배열  lottors  에서 0을 제외한 숫자들의 당첨 개수는 최저 당첨 개수가 된다.
  2. 0이 모두 당첨된다고 가정하면, 0의 개수와 주어진 숫자들의 당첨 개수의 합이 최고 당첨 개수가 된다.

따라서 다음과 같이 풀이했다.

  1. 배열  lottors  를 for문으로 확인한다.
    1.1. zeroCnt : 원소가 0인 경우, 개수를 카운트한다.
    1.2. minWin : 원소가 0이 아닌 경우, 당첨 숫자가 들어있는 배열  win_nums  에 일치하는 숫자가 있는지 확인한다.
  2. getRank() : 당첨 개수를 순위로 환산하여 리턴한다.
    2.1. 최저 순위 = 최저 당첨 개수 minWin = 원소가 0이 아닌 숫자들의 당첨 개수
    2.2. 최고 순위 = 최고 당첨 개수 maxWin = 최저 당첨개수 + 원소가 0인 숫자들의 개수

 

[java 코드]

public int[] solution(int[] lottos, int[] win_nums) {
    int[] answer = new int[2];
    int zeroCnt = 0; // 0으로 표기한 번호 카운트
    int minWin = 0; // 현재 알 수 있는 번호로 당첨된 최저 당첨 카운트
    for (int lot : lottos) {
        if (lot == 0) {
            zeroCnt++;
        }else {
            for (int win : win_nums) {
                if (win == lot) {
                    minWin++;
                }
            }
        }
    }
    int maxWin = minWin + zeroCnt; // 최고 당첨 카운트
    // 당첨된 번호 개수를 순위로 변환
    answer[0] = getRank(maxWin);
    answer[1] = getRank(minWin);
    return answer;
}
/** 순위 변환 */
private int getRank(int winNum) {
    int result = 6;
    switch (winNum) {
        case 6:
            result = 1;
            break;
        case 5:
            result = 2;
            break;
        case 4:
            result = 3;
            break;
        case 3:
            result = 4;
            break;
        case 2:
            result = 5;
            break;
        default:
            result = 6;
            break;
    }
    return result;
}

 

[채점 결과]

코드를 작성해보면서 고민한 포인트는 당첨된 번호 개수를 순위로 변환하는 과정에 있었다. 이러한 경우 단순한 if문 부터Map, ENUM 등 사용할 수 있는 방법이 너무 많아 항상 고민된다. 이번 경우에는 2개~6개가 일치할 경우 당첨 순위가 정해지고, 그외 0개 또는 1개인 경우 낙차이므로 switch문을 사용하여 변환하는 코드를 이용해봤다.

 

 

[참고]

제한사항에 의하면 "배열  lottors   배열  win_nums  는 정렬되어 있지 않을 수도 있다"고 제시되어 있다.

for문으로 일치하는 숫자가 있는지 확인하는 과정에서 두 배열이 모두 정렬되어 있다면, for문의 동작 속도가 더 빠를 수 있다. 하지만, 두 배열 모두 길이 6으로 정해져 있으니 정렬을 하지 않아도 되지않을까 생각했다.

실제로 Arrays.sort() 를 사용하여 정렬한 후 확인해봤더니 역시 속도의 차이가 있었다.

Arrays.sort() 를 사용하여 배열 정렬한 경우

 

반응형