안녕하세요.
오늘은 프로그래머스 lv1 문제 "로또의 최고 순위와 최저 순위" 문제 풀어보겠습니다.
해당 문제 바로가기 ↓↓↓↓ 하단 링크 클릭
https://school.programmers.co.kr/learn/courses/30/lessons/77484
1. 리스트의 count 함수 사용하여 0의 개수 세기
def solution(lottos, win_nums):
# lottos: [44, 1, 0, 0, 31, 25]
# win_nums: [31, 10, 45, 1, 6, 19]
zeros = lottos.count(0) # 리스트에서 0의 개수 세기
print(zeros)
2
[리스트형 자료].count(세고 싶은 대상)
위와 같이 리스트에서 원하는 구성 요소들을 셀 수 있습니다.
lottos 리스트에 0은 2개 있으므로, zeros는 2 입니다.
이렇게 미리 0의 개수를 세어두면 문제를 간단히 풀 수 있습니다.
최고 점수는 0인 숫자들을 다 맞췄다고 생각하면 되고,
최저 점수는 0인 숫자들을 한 개도 못 맞췄다고 생각하면 되기 때문입니다.
다음 단계로 넘어가겠습니다.
2. 순위 값 딕셔너리로 미리 할당
def solution(lottos, win_nums):
# lottos: [44, 1, 0, 0, 31, 25]
# win_nums: [31, 10, 45, 1, 6, 19]
zeros = lottos.count(0) # 리스트에서 0의 개수 세기
win = 0 # win 변수 = 맞춘 개수 (0으로 초기화)
scores = {0: 6, 1: 6, 2: 5, 3: 4, # ★ 포인트1. 경우의 수가 7개 밖에 없으므로
4: 3, 5: 2, 6: 1} # 각각의 맞춘 개수에 순위 할당하기
# ★ 포인트2. 0개 맞은 순위 = 1개 맞은 순위
순위 값들을 딕셔너리에 미리 할당해 두었습니다.
원래 코딩 테스트에서 하드 코딩은 지양해야 하지만,
지금은 워낙 경우의 수가 적으니까요.. (다 해도 7개 밖에 없습니다)
또 한 가지 포인트는, 0개 맞은 순위와 1개 맞은 순위가 같다는 것 입니다. (둘 다 꼴찌)
1개 맞아도 6등으로 처리해야 하고,
다 빗나가도 6등으로 처리해줘야 테스트를 통과할 수 있습니다.
3. 맞은 번호의 개수 세기
def solution(lottos, win_nums):
# lottos: [44, 1, 0, 0, 31, 25]
# win_nums: [31, 10, 45, 1, 6, 19]
zeros = lottos.count(0) # 리스트에서 0의 개수 세기
win = 0 # win 변수 = 맞춘 개수 (0으로 초기화)
scores = {0: 6, 1: 6, 2: 5, 3: 4, # ★ 포인트1. 경우의 수가 7개 밖에 없으므로
4: 3, 5: 2, 6: 1} # 각각의 맞춘 개수에 순위 할당하기
# ★ 포인트2. 0개 맞은 순위 = 1개 맞은 순위
for l in lottos:
if l in win_nums:
win += 1
print('win:', win)
win: 2
이제 lottos 리스트를 하나씩 반복문으로 돌면서,
맞았는지 카운트를 해줍니다.
(win이라는 변수에 저장)
맞춘 번호는 1, 31 입니다.
그래서 win에는 2가 할당되어 있습니다.
4. 최고 점수와 최저 점수 구하기
def solution(lottos, win_nums):
# lottos: [44, 1, 0, 0, 31, 25]
# win_nums: [31, 10, 45, 1, 6, 19]
zeros = lottos.count(0) # 리스트에서 0의 개수 세기
win = 0 # win 변수 = 맞춘 개수 (0으로 초기화)
scores = {0: 6, 1: 6, 2: 5, 3: 4, # ★ 포인트1. 경우의 수가 7개 밖에 없으므로
4: 3, 5: 2, 6: 1} # 각각의 맞춘 개수에 순위 할당하기
# ★ 포인트2. 0개 맞은 순위 = 1개 맞은 순위
for l in lottos:
if l in win_nums:
win += 1
most = win + zeros # 맞춘 번호 + 0이 다 맞았다고 가정 -> 최고 순위
least = win # 0이 다 틀렸다고 가정 -> 최저 순위
print('most:', most)
print('least:', least)
most: 4
least: 2
이제 최고 점수와 최저 점수를 각각 구해봅니다.
최고 점수는 0으로 센 것들이 다 맞았다고 가정하기 때문에,
그냥 zeros를 더해주면 됩니다. (most)
최저 점수는 0으로 된 것들이 다 틀렸다고 생각하면 됩니다.
그래서 그대로 맞은 것들만 반환해 줍니다. (least)(이제와서 생각해보니.. 변수 이름을 highest, lowest로 하는게더 나았을 걸 그랬네요.. 이건 뭐 콩글리시도 아니고..)
5. 마무리
def solution(lottos, win_nums):
# lottos: [44, 1, 0, 0, 31, 25]
# win_nums: [31, 10, 45, 1, 6, 19]
zeros = lottos.count(0) # 리스트에서 0의 개수 세기
win = 0 # win 변수 = 맞춘 개수 (0으로 초기화)
scores = {0: 6, 1: 6, 2: 5, 3: 4, # ★ 포인트1. 경우의 수가 7개 밖에 없으므로
4: 3, 5: 2, 6: 1} # 각각의 맞춘 개수에 순위 할당하기
# ★ 포인트2. 0개 맞은 순위 = 1개 맞은 순위
for l in lottos:
if l in win_nums:
win += 1
most = win + zeros # 맞춘 번호 + 0이 다 맞았다고 가정 -> 최고 순위
least = win # 0이 다 틀렸다고 가정 -> 최저 순위
return [scores[most], scores[least]] # 딕셔너리를 이용하여 깔끔하게 리턴
이제 아까 만들어둔 딕셔너리의 key로
most와 least를 각각 넣어주면 코드가 완성 됩니다.
오늘의 포인트를 2가지로 정리하겠습니다.
※
1. count함수를 이용하여 list의 요소 세기
2. 딕셔너리를 이용하여 순위 계산 쉽게 하기
※
이상으로 마치겠습니다.
반응형
'Python > 알고리즘 문제풀이' 카테고리의 다른 글
[파이썬 알고리즘 꿀팁] 반복되는 문자열 처리법 #시간초과 에러 말끔히 해결! #join vs += (0) | 2022.12.14 |
---|---|
[프로그래머스] 숫자 짝꿍 파이썬 알고리즘 문제풀이 # 반복문 기준 정하기 # sort 함수 안 쓰기 (2) | 2022.12.12 |
[프로그래머스] 기사단원의 무기 파이썬 알고리즘 문제풀이 (약수의 개수 구하기) (0) | 2022.12.08 |
[프로그래머스] 유한소수 판별하기 파이썬 문제 풀이 #유클리드 호제법 #소인수분해 (0) | 2022.11.29 |
[프로그래머스] 햄버거 만들기 파이썬 알고리즘 문제 풀이 (0) | 2022.11.28 |