[프로그래머스(Programmers)] 2021 Dev-Matching: 웹 백엔드 개발자(상반기) :: 로또의 최고 순위와 최저 순위 (java)

1
post-thumbnail

안녕하세요! 오늘은 프로그래머스의 로또의 최고 순위와 최저 순위 문제를 풀어보겠습니다. 이 문제는 2021 Dev-Matching: 웹 백엔드 개발자(상반기) 에서 출제되었습니다.


문제 링크

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

문제 풀이

✔ 최저순위: lotto에서 win_nums와 동일한 숫자 개수 이용
✔ 최고순위: lotto에서 win_nums와 동일한 숫자 개수 + lotto 배열 0의 개수 이용

전체 코드

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

        int zeroCnt = 0;
        int rightCnt = 0;
        
        for (int minwoo : lottos) {
            if (minwoo == 0) {
                zeroCnt++;
                continue;
            }

            for (int winNum : win_nums) {
                if (minwoo == winNum) {
                    rightCnt++;
                    break;
                }
            }

        }

        answer[1] = rightCntToRank(rightCnt);
        rightCnt += zeroCnt;
        answer[0] = rightCntToRank(rightCnt);

        return answer;
    }

    private int rightCntToRank(int rightCnt) {
        final int lastPlace = 6;

        if (rightCnt == 0) {
            return lastPlace;
        } else {
            return lastPlace - rightCnt + 1;
        }
    }
}

느낀점

✔ Arrays.sort는 최대한 사용을 자제하자

처음에는 lottos 배열과 win_nums 배열을 Arrays.sort로 정렬 후 시작했습니다. (제한사항의 "원소가 정렬되어 있지 않다" 는 말을 너무 곧이 곧대로 믿었던 탓일까요...?)

두 차례 정렬을 수행 한 후 소요시간은 다음과 같았습니다.

물론 답은 맞았지만, 대부분 0.3ms가 넘게 소요된 것을 볼 수 있습니다.

생각해보니 두 배열을 정렬할 필요가 전혀 없어보여서, 정렬 메서드를 모두 빼고 다시 수행해봤습니다.

대부분 0.03ms만에 수행이 완료되었습니다.

Arrays.sort 두 번에(심지어 둘 다 배열 크기가 6으로 크지도 않았습니다) 수행 시간이 10배 가까이 차이나는 것을 보고, "정렬은 최대한 자제해야겠구나" 라는 생각이 들었습니다.

0개의 댓글