function solution(lottos, win_nums) {
const zero_num = lottos.filter((num) => num === 0).length
const min = lottos.filter((l) => win_nums.includes(l)).length
const max = min + zero_num
const min_rank = min > 1 ? 7 - min : 6
const max_rank = max > 1 ? 7 - max : 6
return [max_rank, min_rank]
}
min이 0,1 일 때 rank가 6인 것을 처리해주기 위해 삼항연산자를 사용했는데
다른 사람의 풀이를 보니
const rank = [6, 6, 5, 4, 3, 2, 1];
...
return [rank[max], rank[min]]
이런 식으로 처리한 것을 확인했다.
이게 더 사람이 생각하는 논리에 더 가까운 것 같아서 마음에 들었다.
코테 푼지 아직 2일차밖에 되지 않았지만,
코드가 길어지더라도, 최대한 사람이 생각하는 논리 흐름과 비슷한 코드가
보기도 좋고, 풀기에도 도움이 되는 것 같다.
다만 위의 코드는 (내것과 다른 사람 것 모두) 시간복잡도가 커보였다.
filter를 2번 돌리기보다는 1번만 사용하는 것이 더 좋지 않을까 하는 생각도 들었다.
그래서 고쳐본 코드는
function calculateZeroMinMax(lottos, win_nums){
let zero = 0
let min = 0
for (let i in lottos){
if(lottos[i] === 0)
zero++;
else if(win_nums.includes(lottos[i]))
min++
}
const max = min + zero
return {zero, min, max}
}
function solution(lottos, win_nums) {
const rank = [6,6,5,4,3,2,1]
const {zero, min, max} = calculateZeroMinMax(lottos, win_nums)
return [rank[max], rank[min]]
}
사실 가독성은 조금 더 떨어지는 것 같긴 한데,
이정도면 성능도 살리고, 가독성도 어느 정도는 살렸다고 생각한다.