📝 문제
> 로또가 훼손되어 일부 번호를 알아볼 수 없게 되었다. 남아있는 번호를 이용하여 해당 로또의 최고 순위와 최저 순위를 구하라.
https://programmers.co.kr/learn/courses/30/lessons/77484#fn1
코딩테스트 연습 - 로또의 최고 순위와 최저 순위
로또 6/45(이하 '로또'로 표기)는 1부터 45까지의 숫자 중 6개를 찍어서 맞히는 대표적인 복권입니다. 아래는 로또의 순위를 정하는 방식입니다. 1 순위 당첨 내용 1 6개 번호가 모두 일치 2 5개 번호
programmers.co.kr
🎨 풀이
💡 첫번째 시도 = 성공
- 이 문제는 로또의 남아있는 번호로 최고 순위와 최저 순위를 유추하는 문제다.
최고 순위는 [맞은 개수 + 훼손된 개수] 이고, 최저 순위는 [맞은 개수]다.
훼손된걸 다 맞았다고 치면 최고 순위가 될 것이고 다 틀렸다고 치면 최저 순위가 될 것이기 때문이다.
위의 사진을 예로 들면, 21 3 4 는 남아있는 번호인데, 그 중에서 2개가 맞았다고 치면 다른 3개가 다 맞았을 때 5개를 맞춰 2위가 되고, 2개만 맞고 나머지는 다 틀렸을 때는 그대로 5위가 되는 것이다. 그래서 2위가 최고 순위, 5위가 최저 순위다.
def solution(lottos, win_nums):
answer = []
count = 0;
zero_count = lottos.count(0)
for i in lottos:
if i in win_nums:
count += 1;
if count == 0 :
answer.append(6)
if zero_count == 0:
answer.insert(0,answer[0]-zero_count)
else : answer.insert(0,answer[0]-zero_count+1)
elif count == 1 :
answer.append(6)
answer.insert(0,answer[0]-zero_count)
elif count == 2 :
answer.append(5)
answer.insert(0,answer[0]-zero_count)
elif count == 3 :
answer.append(4)
answer.insert(0,answer[0]-zero_count)
elif count == 4 :
answer.append(3)
answer.insert(0,answer[0]-zero_count)
elif count == 5 :
answer.append(2)
answer.insert(0,answer[0]-zero_count)
elif count == 6 :
answer.append(1)
answer.insert(0,1)
return answer
> lottos가 민우가 들고있는 로또 번호이고, win_nums가 당첨번호다.
맨 처음 for문에서 민우 로또에 당첨 숫자가 얼마나 있는지 센 후 count에 저장한다.
그리고, 맞은 개수에 따라서 if문을 돌려 수행한다. if문이 각각 있는 이유는 append 해야할 숫자가 다 달라서 그렇다. count를 이용해서 최저 순위를 answer에 추가한 후, 최저순위 - 0의 개수(zero_count = 훼손된 로또 번호 개수)를 answer의 0번째 자리에 추가해준다. 그러면 끝난다!
💡 두번째 시도 = 성공 = 간결한 버전
def solution(lottos, win_nums):
answer = []
count = 0;
zero_count = lottos.count(0)
for i in lottos:
if i in win_nums:
count += 1;
if count == 0 :
answer.append(6)
if zero_count == 0:
answer.insert(0,answer[0]-zero_count)
else : answer.insert(0,answer[0]-zero_count+1)
else :
answer.append(7-count)
answer.insert(0,answer[0]-zero_count)
return answer
> 위 코드가 좀 조잡해보인다는 생각이 들었다. 그리고, 글을 적다보니 if문이 이렇게 많지 않아도 될 것 같은데? 라는 생각이 들어 해봤는데 성공이 떴다. 위 코드는 최저순위를 추가해주는 과정에서 각각 숫자가 다르다보니 다 따로 elif를 써서 코드가 괜시리 읽기 싫어 보이고 그랬는데, 7-count를 추가해주니까 문제가 잘 해결되었다.
⭐ 느낀점
> 예전에도 풀면서 이 코드는 좀 별로다, 교수님이 보시면 정말 안좋아할 것 같은 그런 코드다 라고 생각했었는데 그래도 확 줄어들어서 기분이 좋다. 이게 아마 2달 전에 풀었던 코드인 것 같은데 그래도 내가 그동안 좀 발전했구나라는 생각도 들고 그렇다. 이 문제가 막 어려운 문제는 아니지만 그래도 나는 조그마한 성장이 느껴져서 좋다. 발전이 없이 그냥 머물고있나 싶었는데 발전을 조금씩 하고있었나보다.
'🎲 알고리즘 공부 > 프로그래머스' 카테고리의 다른 글
[프로그래머스 / Level 1] 숫자 문자열과 영단어 (파이썬) (0) | 2022.03.31 |
---|---|
[프로그래머스 / Level 1] 신규 아이디 추천 (파이썬) (0) | 2022.03.30 |
[프로그래머스 / Level 1] 직사각형 별찍기 (파이썬) (0) | 2022.03.28 |
[프로그래머스 / Level 1] x만큼 간격이 있는 n개의 숫자 (파이썬) (0) | 2022.03.27 |
[프로그래머스 / Level 1] 행렬의 덧셈 (파이썬) (0) | 2022.03.26 |