728x90
문제 링크
초기 정답 코드
function solution(lottos, win_nums) {
let answer = [];
let sameNumCount = 0;
let zeroCount = 0;
// lottos와 win_nums를 크기순으로 정렬
// 우선 이 둘의 같은 숫자의 개수와 0의 개수를 따로 저장
// 같은 숫자의 개수는 최저 점수가 될 것이고, 같은 숫자 + 0의 개수를 더한 순위는 최고 점수가 될 것
lottos.forEach((l) => {
if (win_nums.includes(l)) {
sameNumCount++;
} else if (l === 0) {
zeroCount++;
}
});
console.log(sameNumCount, zeroCount);
// 0 1 2 3 4 5 6
// 6 6 5 4 3 2 1
answer = [...answer, 7 - (sameNumCount + zeroCount), 7 - sameNumCount];
answer[0] = answer[0] > 6 ? 6 : answer[0];
answer[1] = answer[1] > 6 ? 6 : answer[1];
return answer;
}
로직 설명
이 코드는 로또 게임의 결과를 예측하는 함수입니다.
로또 게임의 숫자 배열 'lottos'와 당첨 숫자 배열 'win_nums'를 입력으로 받아, 최고 순위와 최저 순위를 반환합니다.
변수 answer, sameNumCount, zeroCount를 초기화합니다.
- sameNumCount는 로또 번호와 당첨 번호의 일치하는 숫자의 개수를 저장하고,
- zeroCount는 로또 번호 중 0의 개수를 저장합니다.
forEach()를 사용하여 'lottos' 배열의 각 요소를 순회하면서 다음 작업을 수행합니다.
- 만약 해당 로또 번호가 'win_nums' 배열에 존재하면, sameNumCount를 1 증가시킵니다.
- 해당 로또 번호가 0이면, zeroCount를 1 증가시킵니다.
이후에 최고 순위와 최저 순위를 계산하여 answer 배열에 저장합니다.
계산 방식은 다음과 같습니다.
- 최고 순위: 7 - (sameNumCount + zeroCount)
- 최저 순위: 7 - sameNumCount
- 최고 순위와 최저 순위가 6보다 큰 경우, 즉 유효하지 않은 순위인 경우에는 값을 6으로 바꿔줍니다.
마지막으로 answer 배열을 반환합니다.
이 배열에는 [최고 순위, 최저 순위]의 형태로 값이 저장되어 있습니다.
간단한 예시를 들어 설명하겠습니다. 예를 들어, 다음과 같은 입력이 주어졌다고 가정해봅시다.
lottos: [44, 1, 0, 0, 31, 25]
win_nums: [31, 10, 45, 1, 6, 19]
이 경우, sameNumCount는 2가 되고(번호 1과 31이 일치), zeroCount는 2가 됩니다(0이 두 개 있음).
따라서 최고 순위는 7 - (2 + 2) = 3, 최저 순위는 7 - 2 = 5가 됩니다. 결과적으로 함수는 [3, 5]를 반환합니다.
1차 개선 - 순위계산 로직 분리
- answer 배열을 미리 초기화하지 않고, 최종적으로 계산된 순위를 바로 대입합니다. 이렇게 하면 코드가 더 간결해집니다.
- 순위를 계산하는 로직을 rank 함수로 분리하여 중복 코드를 줄였습니다. 이 함수는 숫자를 입력으로 받아, 7에서 입력값을 뺀 값과 6 중 작은 값을 반환합니다. 이렇게 하면 유효한 순위를 쉽게 계산할 수 있습니다.
- 최종적으로 계산된 최고 순위와 최저 순위를 바로 반환하도록 변경하였습니다.
function solution(lottos, win_nums) {
let sameNumCount = 0;
let zeroCount = 0;
lottos.forEach((l) => {
if (win_nums.includes(l)) {
sameNumCount++;
} else if (l === 0) {
zeroCount++;
}
});
const rank = (matchedCount) => Math.min(7 - matchedCount, 6);
const highestRank = rank(sameNumCount + zeroCount);
const lowestRank = rank(sameNumCount);
return [highestRank, lowestRank];
}
End
728x90
'Coding Test > Programmers_JavaScript' 카테고리의 다른 글
[JavaScript/프로그래머스] 연습문제 - 덧칠하기 (0) | 2023.05.09 |
---|---|
[JavaScript/프로그래머스] 연습문제 - 기사단원의 무기 (0) | 2023.05.09 |
[JavaScript/프로그래머스] 연습문제 - 카드 뭉치 (0) | 2023.05.08 |
[JavaScript/프로그래머스] 연습문제 - 최댓값과 최솟값 (0) | 2023.05.08 |
[JavaScript/프로그래머스] 연습문제 - 명예의 전당 (1) (0) | 2023.05.04 |