[프로그래머스] Lv1. 로또의 최고 순위와 최저 순위

zzzzsb·2022년 1월 21일
0

프로그래머스

목록 보기
3/33

문제링크

https://programmers.co.kr/learn/courses/30/lessons/77484


input & output

lottoswin_numsresult
[44, 1, 0, 0, 31, 25][31, 10, 45, 1, 6, 19][3, 5]
[0, 0, 0, 0, 0, 0][38, 19, 20, 40, 15, 25][1, 6]
[45, 4, 35, 20, 3, 9][20, 9, 3, 45, 4, 35][1, 1]


Approach #1


알아볼수 없는 번호 : 0
구매한 로또 번호 : 44, 1, 0, 0, 31 25
당첨 로또 번호 : 31, 10, 45, 1, 6, 19
1,31 2개 일치. 
알아볼수 없는 2개의 번호(0,0)를 각각 10,6이라고 가정하면 3등(4개 일치)까지 당첨 가능.
                              11,7이라고 가정하면 5등(2개 일치)까지 당첨 가능
                              return [3,5]
                              
[45, 4, 35, 20, 3, 9]
[20, 9, 3, 45, 4, 35]
-> 45,4,35,20,3,9 다 일치 (1등)

for문:
lottos[i]와 win_nums[j]를 비교. 같으면 sameCnt++;
lottos[i]===0 이면 zeroCnt++;

function calRank(sameCnt)
rank = 7-sameCnt
if(rank<5) return rank
else return 6

if(zeroCnt===0)이면 rank = calRank(sameCnt)
return [rank, rank];

else 이면 
minRank=calRank(sameCnt);
maxRank=calRank(sameCnt+zeroCnt);
return [minRank, maxRank]

Solution #1

function solution(lottos, win_nums) {
    var answer = [];
    let zeroCnt = 0, sameCnt = 0;
    for(let i=0; i<lottos.length; i++){
        let curNum = lottos[i];
        if(curNum===0){
            zeroCnt++;
            continue;
        }
        for(let j=0; j<win_nums.length; j++){
            if(curNum === win_nums[j]) sameCnt++;
        }
    }
    if(zeroCnt === 0){
        let rank = calRank(sameCnt);
        answer = [rank, rank];
    }
    else {
        let lowRank = calRank(sameCnt);
        let highRank = calRank(sameCnt+zeroCnt);
        answer = [highRank, lowRank];
    }
    return answer;
}

function calRank(sameCnt){
    let rank = 7 - sameCnt;
    return rank < 6 ? rank : 6;
}

N: lottos.length, win_nums.lenght(문제에서는 6)

Time Complexity

O(N^2)

크기가 6인 lottos 배열과 win_nums 배열을 for문 2개로 돌기 때문에 시간복잡도는 위와 같다.

Space Complexity

O(1)

answer 배열은 [highRank, lowRank] 형태로 크기가 2로 고정된 배열이기 때문에 공간복잡도 O(1)


Review

  1. 문제 이해, pseudo code 작성, 최종 코드 작성까지 대략 20분 걸렸다. 문제가 쉬워서 나름 괜찮았음!
  2. 리턴값이 처음에 반대로 나와서 왜지 싶었는데 highRank와 lowRank를 반대로 넣어줘서 그런거 였다.. ㅋㅋㅋ 이런 실수를 하다니,,,
  3. 처음에 Rank계산할때 6개 맞추면 1, 5개 맞추면 2.. 이렇게 무식하게 로직 짰는데 풀다가 생각해보니 7에서 맞은개수를 빼면 rank가 나와서 황급히 수정,,, 하하. 무식한게 가끔은 답일때도 있다지만.. 오늘은 아니었다.

TIL

  • 새롭게 쓴 함수가 없어서 다른 풀이를 참고한 후 작성해보자. 아마 시간복잡도 줄이는 과정에서 새로운 풀이나 개념을 적용한게 있지 않을까?
profile
성장하는 developer

0개의 댓글