문제 : 2021 Dev-Matching: 웹 백엔드 개발자(상반기) > 로또의 최고 순위와 최저 순위
https://school.programmers.co.kr/learn/courses/30/lessons/77484
function solution(lottos, win_nums) {
const dupDelete = lottos.filter(x => !win_nums.includes(x))
const duplicateNumber = lottos.length - dupDelete.length
const getRowRank = array => {
let rowRank = 0;
if(dupDelete.length < 6) {
rowRank += dupDelete.length + 1
}
if(dupDelete.length === 6) {
rowRank = 6
}
return rowRank
}
const getHighRank = array => {
let highRank = 7;
let result = 0;
for(let i = 0; i<dupDelete.length; i++) {
if(dupDelete[i] === 0) {
highRank --
}
}
result = highRank - duplicateNumber
return result > 6 ? result = 6 : result
}
const rowRank = getRowRank(dupDelete)
const highRank = getHighRank(dupDelete)
return [highRank, rowRank]
}
일단 rank 배열 선언은 감탄스러웠다. rank배열의 index로 순위를 편하게 뽑을 수 있다.
minCount로 lottos와 win_nums의 중복 개수를 뽑고, zeroCount로 lottos의 0의 개수를 뽑는다.
최고 순위를 뽑을 수 있게 maxCount는 minCount와 zeroCount를 더해준다.
minCount와 maxCount의 값을 rank 배열의 인덱스로 활용하여 순위를 뽑는다.
상수는 rank 배열에만 쓰이게 하고 가독성도 좋은 풀이라고 생각한다.
function solution(lottos, win_nums) {
const rank = [6, 6, 5, 4, 3, 2, 1];
let minCount = lottos.filter(v => win_nums.includes(v)).length;
let zeroCount = lottos.filter(v => !v).length
const maxCount = minCount + zeroCount;
return [rank[maxCount], rank[minCount]];
}