안녕하세요! 오늘은 프로그래머스의 로또의 최고 순위와 최저 순위 문제를 풀어보겠습니다. 이 문제는 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;
}
}
}
처음에는 lottos 배열과 win_nums 배열을 Arrays.sort로 정렬 후 시작했습니다. (제한사항의 "원소가 정렬되어 있지 않다" 는 말을 너무 곧이 곧대로 믿었던 탓일까요...?)
두 차례 정렬을 수행 한 후 소요시간은 다음과 같았습니다.
물론 답은 맞았지만, 대부분 0.3ms가 넘게 소요된 것을 볼 수 있습니다.
생각해보니 두 배열을 정렬할 필요가 전혀 없어보여서, 정렬 메서드를 모두 빼고 다시 수행해봤습니다.
대부분 0.03ms만에 수행이 완료되었습니다.
Arrays.sort 두 번에(심지어 둘 다 배열 크기가 6으로 크지도 않았습니다) 수행 시간이 10배 가까이 차이나는 것을 보고, "정렬은 최대한 자제해야겠구나" 라는 생각이 들었습니다.