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

kiki·2022년 1월 29일
0

프로그래머스

목록 보기
1/78

문제 링크

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

문제 요약 설명

로또를 사 왔는데 동생이 로또에 낙서를 해둔 것. 자신의 최저 순위와 최고 순위를 알아보고 싶다.
낙서로 알아볼 수 없는 수는 0으로 나타낸다. 6개 다 맞추면 1등, 하나도 못 맞추거나 하나 맞추면 6등.

ex) 내가 고른 수 : 1 4 7 0 0 19 (숫자가 정렬돼있지 않을 수 있다.)
로또 번호 : 1 3 8 19 20 25
-> 맞춘 갯수 : 2개 => 최저 5등, 최고 3등

1차 시도 - 내 코드

def solution(lottos, win_nums):
    Sum = 0
    zero = 0
    for i in lottos:
        if(i==0):
            zero+=1
            continue
        for j in win_nums:
            if(i==j):
                Sum+=1
    answer = []
    if(Sum==0):
        answer.append(6)
        if(zero==0):
            answer.insert(0,6)
        else:
        	answer.insert(0,7-zero)
        return answer
    answer.append(7-Sum)
    answer.insert(0, 7-Sum-zero)
    return answer

코드 설명 : for문을 돌며 0의 갯수를 세고, 당첨 번호와 같은 갯수가 몇개인지 셌다.
그리고 예외를 고려해줘가며 return 할 answer 배열에 추가해줌.

프로그래머스를 처음 사용해보는데 문제를 풀고나면 잘 푼 코드를 보여준다.
보고나니 내 코드가 정말 지저분해 보이는 마법.

  1. for문 안에서 zero를 세지 말고, count() 함수를 이용하면 좋았겠다.
  2. 저렇게 더럽게 계산을 해줄 필요 없이 맞춘 갯수에 해당하는 등수를 배열로 정의해두면 좋았겠다. 그러면 간단히 인덱스로 접근해서 깔끔한 코드를 작성할 수 있었겠다.
  3. answer을 사용하지 않고 그냥 수를 return 해주면 배열로 return이 되나?

2차 시도 - 다시 써본 내 코드

def solution(lottos, win_nums):
    same = 0
    zero = lottos.count(0)
    
    rank = [6, 6, 5, 4, 3, 2, 1]
    for i in lottos:
        for j in win_nums:
            if(i==j):
                same+=1
    return rank[same+zero],rank[same]

위에서 고민한대로 다시 코드를 작성해봤다.

그리고 다시 잘 쓴 코드를 봤다. for j in win_nums: if ~~ : same+=1 부분을
if i in win_nums: same+=1 이렇게 작성했다.
와우 코테 공부가 아니라 파이썬 공부를 해야겠네.

정리

  1. 리스트 내의 요소 갯수 세기 위해서 count 함수 사용
  2. 배열을 이용한 등수 사전 정의
  3. if x in 리스트: 사용 할 수 있다!

0개의 댓글