[Algorithm] Lv1. 로또 최고 순위, 최저 순위
Intro
프로그래머스 Lv1. 문제인 로또 최고 최저순위 문제를 풀다가 계속 코드가 깔끔하지 못하고 쓸데없는 분기문을 작성하는 것 같아서 기억하고자 포스팅한다.
문제

입출력 예시

🥸 나의 접근 방법
- 로또 맞춘 개수에 따른 등수를 dict 선언한다.
- lottos 번호를 하나씩 꺼내서 0이 아닌 숫자 중 로또 당첨 번호일 경우 맞춘 개수 변수에 증감을 진행한다. 0이라면 0을 세는 변수에 증감을 진행한다.
- 0이 있을 떄 최고 순위는 맞춘 개수 + 0의 개수가 되며, 최저 순위는 맞춘 개수가 된다.
- 0이 한 개 이상인 경우 맞춘개수 + 0의 개수로 dict[key] = value 문법을 사용하여 answer에 최고 순위를 넣고, 최저 순위는 기존 맞춘 개수로 answer에 최저 순위를 넣었다.
🤩 다른 접근 방법(정답, 블로그 참고)
- 기존 풀이와 다른 방법은 아니지만 리팩토링 할 부분이 있어서 적어본다.
- 수정 부분
- count 사용
- 기존 코드에서 0의 개수를 else 절에서 카운트했는데, 굳이 else절에서 사용하지 않고도 count 내장 함수를 사용하여 해결이 가능하다.
- if, else문 삭제
- 0이 없다면 연산에서 달라지는 점이 없는데 굳이 if, else문을 사용하지 않았어도 됐다. (습관성으로 If, else문을 사용하였음.)
- count 사용
- 수정 부분
⭕️ 정답 코드1(나의 풀이)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
def solution(lottos, win_nums):
answer = []
# 알 수 없는 번호 = 0, 구매한 로또 번호 -> lottos
# 순위
# 1. 6개 모두 일치 1등, 5개 2등, ... , 2개 일치 5등, 그외 낙첨
lotto_rank = {6:1, 5:2, 4:3, 3:4, 2:5, 1:6, 0:6}
# 맞은 개수
lotto_right_cnt, zero_cnt = 0, 0
for i in lottos:
if i != 0:
if i in win_nums:
lotto_right_cnt += 1
else:
zero_cnt += 1
# 0이 한 개라도 있는 경우
if zero_cnt > 0:
lotto_high_cnt = lotto_right_cnt + zero_cnt
answer.append(lotto_rank[lotto_high_cnt])
answer.append(lotto_rank[lotto_right_cnt])
else:
answer.append(lotto_rank[lotto_right_cnt])
answer.append(lotto_rank[lotto_right_cnt])
return answer
⭕️ 정답 코드2(리팩토링 코드)
1
2
3
4
5
6
7
8
9
10
11
12
13
def solution(lottos, win_nums):
answer = []
# 알 수 없는 번호 = 0, 구매한 로또 번호 -> lottos
# 순위
# 1. 6개 모두 일치 1등, 5개 2등, ... , 2개 일치 5등, 그외 낙첨
lotto_rank = {6:1, 5:2, 4:3, 3:4, 2:5, 1:6, 0:6}
# 맞은 개수
lotto_right_cnt, zero_cnt = 0, lottos.count(0)
# print(zero_cnt)
for i in lottos:
if i in win_nums:
lotto_right_cnt += 1
return [lotto_rank[zero_cnt + lotto_right_cnt], lotto_rank[lotto_right_cnt]]
회고
- 무언가를 세야 할 때 count 함수를 쓰도록 생각하자.
- 습관적으로 if, else문을 사용하는 것을 지양하자.