[프로그래머스 / lv.1] 실패율
in Problem Solving on Programers
날짜: 2021년 6월 21일
소요 시간: 39분 58초
카테고리: 수학문제
태그: 레벨1
, 파이썬
입출력 예시
N | stages | result |
---|---|---|
5 | [2,1,2,6,2,4,3,3] | [3,4,2,1,5] |
4 | [4,4,4,4,4] | [4,1,2,3] |
내가 적은 코드
def solution(N, stages):
answer = []
fail_rate = []
for i in range(N):
success = 0
for j in stages:
if j-1 >= i:
success += 1
if success != 0:
fail_rate.append(float(stages.count(i+1))/float(success))
else:
fail_rate.append(0)
temp = sorted(fail_rate, reverse = True)
for k in range(len(fail_rate)):
answer.append(fail_rate.index(temp[k])+1)
fail_rate[fail_rate.index(temp[k])] = ""
return answer
풀이 과정
전체 스테이지의 수 N만큼 반복하는 반복문을 만든다.
stages의 원소들에 1을 뺀 값(range(N)은 0부터 N까지 / stage는 1부터 N+1까지)을 반복하여 N보다 클 경우 success
에 1씩 더하여 카운팅한다.
분모(success)가 0이 되면 안되기 때문에 조건을 추가하고, 실패율을 계산하여 리스트 fail_rate
에 순서대로 담는다.
리스트 temp
에 오름차순으로 정리 한 fail_rate
의 값들을 담는다.
fail_rate
의 길이만큼 반복하여 실패율이 높은 값부터 정렬되어 있는 temp
의 인덱스 값을 가진 fail_rate
원소의 인덱스 값에 1을 더한 값(배열의 인덱스 값은 0부터 시작하고, 스테이지는 1부터 시작하기 때문)을 리스트 answer
에 추가한다.
-> 그러니까 실패율이 높은 순으로 정리한 리스트 temp
의 원소의 인덱스 값을 리스트 fail_rate
에서 인덱싱하여 그 값을 answer
에 추가하면 실패율이 높은 스테이지 순으로 추가된다.
(중복 방지를 위해 한번 꺼낸 temp의 인덱스에는 빈 값을 삽입한다.)
실패율이 높은 순으로 정리된 스테이지 값이 들어가 있는 리스트 answer
을 출력한다.
베스트 코드
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)
반성
- 파이썬의 딕셔너리를 통해 더 간결하게 풀 수 있다는 것을 인지하고 있었으나 딕셔너리의 이해도가 낮아 제대로 활용할 수 없을 것 같아 딕셔너리로 풀지 못하였다. 파이썬을 좀더 자유자재로 활용할 수 있도록 이해도를 높일 필요가 있다.
- 리스트의 원소를 인덱싱한 값을 또 sorting된 다른 리스트에 인덱싱하여 그 인덱스 값을 다른 리스트에 저장하는 건 내가 풀었지만 포스팅을 위해 다시 생각해도 또 헷갈리고 그런다…