반응형
프로그래머스 programmers Level1 로또의 최고 순위와 최저 순위 - java
[문제]
https://school.programmers.co.kr/learn/courses/30/lessons/77484
프로그래머스
코드 중심의 개발자 채용. 스택 기반의 포지션 매칭. 프로그래머스의 개발자 맞춤형 프로필을 등록하고, 나와 기술 궁합이 잘 맞는 기업들을 매칭 받으세요.
programmers.co.kr
[풀이]
문제를 해석하면 다음과 같다
- 주어진 배열 lottors 에서 0을 제외한 숫자들의 당첨 개수는 최저 당첨 개수가 된다.
- 0이 모두 당첨된다고 가정하면, 0의 개수와 주어진 숫자들의 당첨 개수의 합이 최고 당첨 개수가 된다.
따라서 다음과 같이 풀이했다.
- 배열 lottors 를 for문으로 확인한다.
1.1. zeroCnt : 원소가 0인 경우, 개수를 카운트한다.
1.2. minWin : 원소가 0이 아닌 경우, 당첨 숫자가 들어있는 배열 win_nums 에 일치하는 숫자가 있는지 확인한다. - 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() 를 사용하여 정렬한 후 확인해봤더니 역시 속도의 차이가 있었다.
반응형