[코테] 로또의 최고 순위와 최저 순위

이동창·2022년 4월 12일
0

코딩테스트

목록 보기
2/5

아쉬웠던 점

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]]
}

사실 가독성은 조금 더 떨어지는 것 같긴 한데,
이정도면 성능도 살리고, 가독성도 어느 정도는 살렸다고 생각한다.

0개의 댓글