민우는 로또를 구매함. 그러나 민우의 동생이 로또에 낙서를 하여, 일부 번호를 알아볼 수 없음. 알아볼 수 없는 번호를 '0'으로 표기하고, 민우가 구매한 로또로 당첨이 가능한 최고 순위와 최저 순위를 알아보자.
function solution(lottos, win_nums) {
var answer = [];
let highest_rank = 0;
let lowest_rank = 0;
let zero = 0;
let correct_nums = 0;
for(let i=0 ; i < lottos.length ; i++) {
for(let j=0 ; j < win_nums.length ; j++) {
if(win_nums[j] === lottos[i])
correct_nums += 1;
}
if(lottos[i] === 0)
zero += 1;
}
if((correct_nums == 0) && (zero == 6)) {
highest_rank = 1;
lowest_rank = 6;
}
else if((correct_nums == 0) && (zero == 0)) {
highest_rank = 6;
lowest_rank = 6;
}
else {
highest_rank = (7 - (correct_nums + zero));
lowest_rank = (7 - correct_nums);
}
answer = [highest_rank, lowest_rank];
return answer;
}
highest_rank와 lowest_rank를 파악하기에 앞서 당첨 번호와 일치하는 번호의 갯수와 0의 갯수를 파악하기로 했다. highest_rank는 '7에서 correct_nums와 zero를 더한 것을 빼면' 되고, lowest_rank는 '7에서 correct_nums를 빼면' 된다.
왜 7에서 빼냐면, 0개를 맞춰서 6등을 하는 경우를 제외하면 등수와 일치한 숫자의 갯수를 더하면 7이기 때문이다. 이 방법의 경우, rank 계산을 할 때 if 조건문들로 예외의 경우를 따져주어야 한다는 번거로움이 있다.
일단 중첩 for문을 써서 민우의 복권 번호와 당첨 번호가 일치하는 correct_nums와 0의 갯수를 파악했다. correct_nums는 무조건 당첨된 번호 갯수이고, zero는 다 맞을수도, 다 틀릴수도 있는 갯수이다.
원래 highest_rank와 lowest_rank를 계산할 때
highest_rank = (7 - (correct_nums + zero));
lowest_rank = (7 - correct_nums);
이렇게만 적으면 될거라고 생각했다. 그런데 코드를 실행해보니 테스트 14가 계속 실패하더라. 곰곰히 생각해보니 예외의 경우가 있었다. correct_nums가 0이고 zero가 6일 때는 lowest_rank가 7이 된다... correct_nums가 0이고 zero가 0일 때는 highest_rank와 lowest_rank가 둘 다 7이 된다.... 이렇게 두 경우를 예외의 경우로 보고 if 조건문에 추가해서 코드를 작성했더니 테스트 14도 통과가 되었다.
나만 너무 복잡한가 싶어서 다른 분들이 작성하신 코드도 보았다. 오,,, 내 코드만 복잡하더라...(?)ㅋㅋㅋㅋ rank를 애초에 array로 작성하고 코드를 작성한 경우가 꽤 많았다. 역시.. 간략한 코드 작성을 위해선.. 가방끈이 길어야 한다..