CodingTest/Programmers

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

EEOOOO 2022. 6. 22. 12:42

 

/  제출 1  /

 

def score(num):
    if num == 6:
        return 1
    elif num == 5:
        return 2
    elif num == 4:
        return 3
    elif num == 3:
        return 4
    elif num == 2:
        return 5
    else:
        return 6
        
    
def solution(lottos, win_nums):
    lotto_cnt = 0
    # 1. lottos에서 win_nums에 속해있는 것을 골라낸다.
    for lotto_num in lottos:
        if lotto_num in win_nums:
            lotto_cnt += 1
    # 2. lottos에서 0의 개수를 찾는다.
    zero_cnt = lottos.count(0)
    # 3. 최고순위 찾는 경우: 0의 개수만큼 더하기
    best = lotto_cnt + zero_cnt
    # 4. 최저순위 찾는 경우: 0 안 더하기
    worst = lotto_cnt
    # 5. 개수에 맞게 *당첨방식에 근거해* 결과 산출해* 리턴
    answer= [score(best), score(worst)]
    return answer
채점 결과
정확성: 100.0
합계: 100.0 / 100.0
 
깔끔하게 넘겼습니다.
이 문제에서 스스로 칭찬할 점은 ' 알고리즘 ' 답게 작성하려고 노력해본 것입니다.
문제에 대한 입, 출력을 생각하고, 어떤 알고리즘을 사용할까, 예외 케이스가 있는가 를 생각하며 풀었습니다.
다만, 어떤 자료구조를 사용할까, 그에 맞는 시간 복잡도는 무엇인가 등은 문제가 간단해 크게 생각하고 풀지는 않았습니다.
구현에 조금 더 빨리 익숙해지고 해당 부분을 떠올리기 위한 지식을 정리하고 떠올리는 연습을 계속 해나가야할 것 같습니다.
또한 코드가 충분히 친절하다면 저렇게 구체적인 주석은 필요없을 수 있으니 제거하는게 좋을 것도 같습니다.
지금은 연습 단계이니 꼼꼼히 해나갑시다.
 

 

/  다른 분들 풀이  /

 

def solution(lottos, win_nums):

    rank=[6,6,5,4,3,2,1]

    cnt_0 = lottos.count(0)
    ans = 0
    for x in win_nums:
        if x in lottos:
            ans += 1
    return rank[cnt_0 + ans],rank[ans]

 

음 ! 사실 제 풀이가 불필요한 부분을 포함하고 있다는 것을 인지했습니다.

예를 들면 best나 worst같이 변수를 따로 설정하는 부분같이요. 또한 순위 측정 부분에서 별개 기능으로 구분해 써야 안 헷갈릴 것 같아 그와 같이 작성했습니다.

하지만 간단한 프로그래밍에서 이런 식으로도 가능하다는 것 역시 기억합시다.

 

특히, 저번 문제에서도 그랬던 것 같은데, rank구하는 부분을 값을 인덱스처럼 사용해서 배열을 사전으로써 사용할 수 있게 이 분이 구현하셨는데 효율적인 접근인 것 같습니다. 불필요한 if else 비교 대신 바로 접근이 가능하기 때문입니다.

또 다른 하단 사례 역시 좋습니다. 딕셔너리를 사용해 바로 접근이 가능하게 하는게 더 옳았습니다.

dic = {6:1, 5:2, 4:3, 3:4, 2:5, 1:6, 0:6}