본문 바로가기

문과 코린이의, [알고리즘] 기록

[문과 코린이의 IT 기록장] JS(Javascript) 프로그래머스(Programmers) 코딩 테스트 - 로또의 최고 순위와 최저 순위

반응형

[문과 코린이의 IT 기록장] JS(Javascript) 프로그래머스(Programmers) 코딩 테스트 - 로또의 최고 순위와 최저 순위

[문과 코린이의 IT 기록장] JS(Javascript) 프로그래머스(Programmers) 코딩 테스트 - 로또의 최고 순위와 최저 순위

 


 

코딩테스트 연습 - 로또의 최고 순위와 최저 순위

로또 6/45(이하 '로또'로 표기)는 1부터 45까지의 숫자 중 6개를 찍어서 맞히는 대표적인 복권입니다. 아래는 로또의 순위를 정하는 방식입니다. 1 순위 당첨 내용 1 6개 번호가 모두 일치 2 5개 번호

programmers.co.kr


[ 풀이 1 ]

- for문, if문 사용

function solution(lottos, win_nums) {

    let gcnt = 0; // 나의 로또번호 = 실제 로또값인 개수
    let ocnt = 0; // 나의 로또번호 = 0인 개수
    const cnt = Array(2).fill(0); // 최종 배열 [최고등수, 최저등수]
    
    
    for(let l=0; l<lottos.length; l++){ // 내가 가진 로또번호 회전
        // 내 로또번호 = 0이라면, ocnt 1추가
        if(lottos[l] == 0){
            ocnt += 1; // const는 변수 재할당 불가능. let으로 선언해야 함.
            continue;
        }
        
        for(let i=0; i<win_nums.length; i++){
            if(lottos[l] == win_nums[i]){
                gcnt++;
                break;
            }
        }
    }
    cnt[0] = checkRanking(gcnt+ocnt);
    cnt[1] = checkRanking(gcnt);

    return cnt;
}


function checkRanking(checkCnt){
    if(checkCnt === 6){ return 1; }
    else if(checkCnt === 5){ return 2; }
    else if(checkCnt === 4){ return 3; }
    else if(checkCnt === 3){ return 4; }
    else if(checkCnt === 2){ return 5; }
    else{ return 6; }   
}

[ 풀이 2 ]

- for문, case문 사용

function solution(lottos, win_nums) {

    let gcnt = 0; // 나의 로또번호 = 실제 로또값인 개수
    let ocnt = 0; // 나의 로또번호 = 0인 개수
    const cnt = []; // 최종 배열 [최고등수, 최저등수]
    
    
    for(let l=0; l<lottos.length; l++){ // 내가 가진 로또번호 회전
        // 내 로또번호 = 0이라면, ocnt 1추가
        if(lottos[l] == 0){
            ocnt += 1; // const는 변수 재할당 불가능. let으로 선언해야 함.
            continue;
        }
        
        for(let i=0; i<win_nums.length; i++){
            if(lottos[l] == win_nums[i]){
                gcnt++;
                break;
            }
        }
    }
    console.log(gcnt+ocnt, gcnt)
    
    
    switch(gcnt+ocnt){ // 최고 일치값
        case 6:
            cnt[0] = 1;
            break; // switch case문에서는 break 무조건 써주기ㅠㅠ...
        case 5:
            cnt[0] = 2;
            break;
        case 4:
            cnt[0] = 3;
            break;
        case 3:
            cnt[0] = 4;
            break;
        case 2:
            cnt[0] = 5;
            break;
        default:
            cnt[0] = 6;
            break;
    }
    
    switch(gcnt){ // 최저 일치값
        case 6:
            cnt[1] = 1;
            break;
        case 5:
            cnt[1] = 2;
            break;
        case 4:
            cnt[1] = 3;
            break;
        case 3:
            cnt[1] = 4;
            break;
        case 2:
            cnt[1] = 5;
            break;
        default:
            cnt[1] = 6;
            break;
    }
    
    return cnt;
    
}

[ 풀이 3 ]

- filter(), includes(), length 사용

- rank 배열로 정의하여 사용

function solution(lottos, win_nums) {
    const rank = [6, 6, 5, 4, 3, 2, 1]; // 0개, 1개, 2개, 3개, 4개, 5개, 6개 맞춤 => 등수
    
    // filter() : a => b , a중 b조건에 해당하는 것을 걸러라.
    // includes() : 특정 문자열을 포함하는지를 확인하는 메서드 => 포함하면 true(1)반환, 포함하지 않으면 false(0)반환
    // filter(v => true)이면 해당 v는 가져오고, filter(v => false)이면 해당 v는 걸러진다.
    let minCount = lottos.filter(v=>win_nums.includes(v)).length;
    // filter(v => v==0) : v값이 0인 것들만 가져와라
    // filter(v => !v) : v값을 전환하여, false => true가 된 값들만 가져와라. (즉 0의 값만 가져올 수 있도록 한 것)
    let zeroCount = lottos.filter(v=>v==0).length;
    
    const maxCount = minCount + zeroCount;
    
    return [rank[maxCount],rank[minCount]];
}

* 유의사항
- 아직 공부하고 있는 문과생 코린이가, 정리해서 남겨놓은 정리 및 필기노트입니다.
- 정확하지 않거나, 틀린 점이 있을 수 있으니, 유의해서 봐주시면 감사하겠습니다.
- 혹시 잘못된 점을 발견하셨다면, 댓글로 친절하게 남겨주시면 감사하겠습니다 :)
반응형