Notice
Recent Posts
Recent Comments
«   2025/05   »
1 2 3
4 5 6 7 8 9 10
11 12 13 14 15 16 17
18 19 20 21 22 23 24
25 26 27 28 29 30 31
Tags
more
Today
Total
관리 메뉴

차차로그

[JS] 2021 Dev-Matching: 웹 백엔드 개발자(상반기) > 로또의 최고 순위와 최저 순위 본문

코딩테스트

[JS] 2021 Dev-Matching: 웹 백엔드 개발자(상반기) > 로또의 최고 순위와 최저 순위

차차한 2022. 8. 5. 17:04

분명 레벨1이라고 해서 풀었는데 어려움..

나는 마이너스레벨이다

내 로또 번호를 확실히 알 수 없을 때 로또 당첨 최고 순위와 최저 순위를 찾아라!

주의할 점

1. 내 로또에서 0은 맞을 수도, 틀릴 수도 있다.

2. 내 로또와 당첨 로또가 하나도 안 맞을 수도 있다.

function solution(lottos, win_nums) {

    let count = 0;
    let zeroCnt = 0;
    
    for(var i = 0; i < lottos.length; i++){
        for(var j = 0; j < win_nums.length; j++){ 
            if(lottos[i] == win_nums[j] && lottos[i] != 0){
                count++;
            }
        }      
        if(lottos[i] == 0){
                zeroCnt++;
        }
    }    
    if(count == 0 && zeroCnt == 0){
        var answer = [6, 6];
    }else{
        answer = [7-count-zeroCnt, count == 0 ? 6 : 7-count];
        }
    return answer;
}

처음에는 하나도 감을 못 잡고 일일이 if문 switch문써서 하드코딩을 했다.. 그런데도 틀림 아놔 ㅠ 

다시 싹다 지우고 시작을 했다.

먼저 내 로또와 당첨로또에서 일치하는 번호 개수를 찾기 위해 이중 for문을 돌려서 count를 올렸다.

이때 내 로또에서 0이 아닌 경우는 배제하고 따로 if문을 작성해 제로카운트 수를 플러스했다.

answer = [7-count-zeroCnt, count == 0 ? 6 : 7-count];

처음에는 if문 없이 위 코드만 작성했다.

6개를 맞았을 때면 로또에 0이 없으니까 7-6-0, 7-6해서 [1,1]

5개를 맞았을 때 0이 1개일 수도 있고 아닐 수도 있다.

0이 1개일 경우가 예상할 수 있는 최고 순위기 때문에 zeroCnt는 1로 둔다.

[7-5-1, 7-5]해서 [1,2] 최고 1등 최저 2등

이런식으로 계속 계산을 하면 되는데 만약에 하나도 맞지 않는 경우가 생길 수도 있다.

그런 경우에는 최저 순위는 무조건 6등이다.

그래서 삼항연산자를 써서 count ==0이면 6이 들어가게 코드를 작성했다.

이렇게 돌렸을 때 자꾸 14번 케이스에서 오류가 났다.

분명 내 로또랑 당첨 로또랑 다 안 다른 경우를 생각하고 코드를 짰다고 생각했는데 아니었음..

만약에 두 번호가 모두 다른 경우에도 내 로또 번호가 모두 0일 수도 있고 완전히 [1,2,3,4,5,6] / [7,8,9,10,11,12]처럼 다를 수도 있다.

내가 짠 코드로는 전자인 경우만 필터링됐기에 후자의 경우 값이 제대로 나오지 않은 것이었다.

맞는 숫자도 0이고 0 개수도 0일 때 조건을 걸어서 무조건 [6,6]이 되게 작성하니 드디어 테스트 통과!!

풀이시간이 꽤 걸린 것을 보면 .. 그렇게 좋은 코드는 아니다.

그래도 포기않고 끝까지 풀었다는 것에 의의를 둔다..!

 

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

다른 사람 문제 풀이

나올 수 있는 순위를 배열에 담고 filter메소드로 카운트를 정했다.

filter메소드는 주어진 함수의 테스트를 통과하는 모든 요소를 모아 새로운 배열로 반환한다.

lottos의 길이만큼 인덱스 값을 뽑아내 win_nums가 그것을 포함하고 있는지를 체크한다. 포함을 한다면 그것을 새로운 배열로 만들어 그 길이를 재면 일치하는 숫자의 개수를 구할 수 있다.!0 은 true인 것을 이용해 인덱스 값에 0이 있으면 그것만으로 배열을 만들어 그 개수를 구할 수 있다 .... (대박!!!!!)

변수 maxCount는 일치하는 개수, 0의 개수를 더한 값. 0이 모두 맞을 수도 있기 때문에!

만약에 maxCount가 6개면 rank[6]을 찾고 minCount가 0이면 rank[0]을 찾아 [1,6]을 리턴한다.

진짜 코드보고 미쳤다 소리 나왔다.

풀이시간도 훨씬 짧다!!!!

filter나 !0이나 잘 안 써봐서 처음에는 코드를 봐도 어떻게 푸는 건지를 잘 몰랐다.

내가 푸는 것도 중요하지만 다른 사람의 풀이를 보고 해석하는 것도 중요하다는 것을 다시 깨닫게 된 시간..

물론 어렵고 머리 깨지겠지만 하루에 하나..이틀에 하나씩이라도 꼭 풀어보자 ..!!

Comments