[프로그래머스 / Python] 실패율
- Coding Test/프로그래머스
- 2021. 6. 15.
문제 출처
https://programmers.co.kr/learn/courses/30/lessons/42889
해당 스테이지에 사람이 없을때 예외처리를 안해주면 런타임 에러가 발생한다. 왜냐면 예를들어 10개의 스테이지가 있을때 모든 사람이 최대 5번 스테이지밖에 못갔다면 6~10 스테이지는 도전한 사람수가 0이기 때문이다.
또 주의 할 점은 이미 fail_rate에 스테이지 순으로 오름차순 정렬되도록 값을 넣었으므로 따로 정렬조건을 추가해 줄 필요 없다.
이 부분만 잘 신경쓰면 쉽게 풀 수 있다.
내 코드
def solution(N, stages):
fail_rate = []
length = len(stages)
for i in range(1, N+1):
user_number = stages.count(i)
# user_number 가 0명일때는 실패율이 0임. 시도한사람이 없기때문
# 이 if문 안걸면 런타임 에러발생 (왜냐면 초반 스테이지만 클리어한 유저만 있다면 후반부는 전부 user_number가 0이기 때문)
if user_number == 0:
fail_rate.append((0,i))
continue
fail_rate.append((user_number / length, i))
length -= user_number # 이번 스테이지인원은 다음 스테이지 참여자 수에서 제외
fail_rate.sort(key=lambda x: x[0], reverse=True) # 작은 번호순으로 이미정렬 되있으므로 실패율 기준 정렬만 함
answer = [i[1] for i in fail_rate]
return answer
정렬에 대한 예제를 다시 확인하여 다음 문제에 잘 적용하도록 하자
a = [(4,0), (4,3), (4,2), (3,2), (2,1), (1,0)]
# 인자 없이 sorted()를 사용하면 리스트 아이템의 각 요소 순서대로 정렬
# 첫 번째 요소가 같으면 두 번째 요소로 비교
b = sorted(a)
print(b) # [(1, 0), (2, 1), (3, 2), (4, 0), (4, 2), (4, 3)]
# key인자에 lambda 함수를 넘겨주면 반환값을 가지고 비교해 정렬
# 이 때, key로 전달되지 않은 요소에 대해선 정렬하지 않음
c = sorted(a, key=lambda x : x[0])
print(c) # [(1, 0), (2, 1), (3, 2), (4, 0), (4, 3), (4, 2)]
d = sorted(a, key=lambda x : x[1])
print(d) # [(4, 0), (1, 0), (2, 1), (4, 2), (3, 2), (4, 3)]
# 정렬 기준으로 다중 조건을 넘겨줄 수도 있다
# 첫 번째 인자를 기준으로 오름차순 정렬을 먼저 한다.
# 그 결과를 가지고 두 번째 인자를 기준으로 내림차순 정렬(-를 붙이면 내림차순 정렬)
e = sorted(a, key = lambda x : (x[0], -x[1]))
print(e) # [(1, 0), (2, 1), (3, 2), (4, 3), (4, 2), (4, 0)]
다른사람이 푼 방법
def solution(N, stages):
result = {}
denominator = len(stages)
for stage in range(1, N+1):
if denominator != 0:
count = stages.count(stage)
result[stage] = count / denominator
denominator -= count
else:
result[stage] = 0
return sorted(result, key=lambda x : result[x], reverse=True)
이런식으로 익셔너리를 이용하여 정렬후 list로 반환하여 풀면 훨씬 간결하게 풀 수 있다.
'Coding Test > 프로그래머스' 카테고리의 다른 글
[프로그래머스 / Python] 문자열 내 p와 y의 개수 (0) | 2021.06.22 |
---|---|
[프로그래머스 / Python] 문자열 내 마음대로 정렬하기 (0) | 2021.06.22 |
[프로그래머스 / Python] 직사각형 별찍기 (0) | 2021.06.21 |
[프로그래머스 / Python] 수박수박수박수박수박수? (0) | 2021.06.21 |
[프로그래머스 / Python] 다트 게임 (0) | 2021.06.16 |