연습장
13. 실패율 본문
N : 전체 스테이지 갯수
stages : 유저의 현재 진행중인 stage 단계
result : 실패율이 높은 순서부터, 같을 경우 더 낮은 stage 부터
case 1 의 경우
stages[0] = 2 는 1번째 유저가 2stage에 도전하고 있다는 뜻이다.
stages[3] = 6 는 4번째 유저가 모든 stage 를 클리어 했다는 뜻이다.
실패율
해당 stage 에 도전중인 유저 수 / 이전 stage 를 클리어한 유저 수
stage 1 = 1/8
stage 2 = 3/7
stage 3 = 2/4
stage 4 = 1/2
stage 5 = 0/1
이며 3,4 가 0.5로 가장 높은 실패율을 가지므로
result = [ 3, 4 .. ] 에 그 다음 실패율을 가지는 2stage
result = [3, 4, 2 ... ] 그리고 1 stage , 5stage 순서로
result = [3, 4, 2, 1, 5] 가 된다.
stages 에 존재하는 해당 원소의 갯수를 알아야 하며
{stage1 : 1 , stage 2: 3, stage3 : 2, stage4 : 1, stage5 : 0, stage 6: 1 }
or
각 인덱스 위치에 따라서 다음과 같이 표기 할 수도 있다. [1,3,2,1,0,1]
배열방식이 조금 더 편할꺼같다.
다음과 같이 만들어진 배열에 [1,3,2,1,0,1]
실패율[n+1] = 배열[n] / 배열[n:] 의 합
다음과 같은 로직으로 진행한다면
실패율 1 = 배열[0] / 배열[0:] 의 합
실패율 1 = 1 / 8
실패율 2 = 3 / 7
...
과 같이 그럴듯하게 만들어진다.
얻어진 실패율에 대해서
{실패율1 : 1/8 , 실패율2 : 3/7 , ... } 의 객체 형태로 저장한 다음
value 가 높은 순(내림차순) 으로 정렬 -> key 가 낮은 순 (오름차순) 으로 정렬 하면 원하는 result 가 구해진다.
1. stages 를 계산용 list 로 만든다.
2. 실패율을 계산하여 객체로 저장한다.
3. 정렬하고 result 를 만든다.
1. stages 를 계산용 list 로 만든다.
def solution(N, stages):
answer = []
# 1. stages -> my_stages
stages.sort()
for i in range(1,N+2):
num = stages.count(i)
print(i,"의 갯수",num)
return answer
count 를 이용하여 원소의 갯수를 알 수 있다. 결과를 확인 했으니 배열을 만들어서 저장하도록 한다.
def solution(N, stages):
answer = []
my_stages = []
# 1. stages -> my_stages
stages.sort()
for i in range(1,N+2):
num = stages.count(i)
my_stages.append(num)
print(my_stages)
return answer
2. 실패율을 계산하여 객체로 저장한다.
실패율[n+1] = 배열[n] / 배열[n:] 의 합
1 = my_stages[0] / sum(my_stages[0:])
list 원소의 합은 sum 을 이용하면 되고
객체로 저장하기 위해서 빈 객체를 만들어준다.
def solution(N, stages):
answer = []
my_stages = []
# 1. stages -> my_stages
stages.sort()
for i in range(1,N+2):
num = stages.count(i)
my_stages.append(num)
# 2. obj
my_obj = {}
for i in range(len(my_stages)-1):
fail_rate = my_stages[i] / sum(my_stages[i:])
my_obj[i+1] = fail_rate
print(my_obj)
return answer
다음과 같이 각 stage 를 key 로 하며 실패율(fail_rate) 를 value 로 하는 객체가 만들어졌다.
3. 정렬하고 result 를 만든다.
3-1. value 가 높은 순(내림차순) 으로 정렬
3-2. 같은 경우 key 가 낮은 순 (오름차순) 으로 정렬
def solution(N, stages):
answer = []
my_stages = []
# 1. stages -> my_stages
stages.sort()
for i in range(1,N+2):
num = stages.count(i)
my_stages.append(num)
# 2. obj
my_obj = {}
for i in range(len(my_stages)-1):
fail_rate = my_stages[i] / sum(my_stages[i:])
my_obj[i+1] = fail_rate
# 3. 정렬
my_obj = dict(sorted(my_obj.items(), key = lambda item:item[1], reverse=True))
print(my_obj)
return answer
객체정렬은 할때 마다 찾아보게 된다.
sorted 함수를 이용하며
key를 이용하여 value 값을 기준으로 정렬하며
reverse 를 이용하여 기존 오름차순을 내림차순으로 바꾼다.
3-2. 같은 경우 key 가 낮은 순 (오름차순) 으로 정렬은 따로 하지 않아도 원하는대로 되어있는것을 알 수 있다.
마지막으로 이 값의 key 값을 순서대로 result list 로 만들어서 제출하면 된다.
def solution(N, stages):
answer = []
my_stages = []
# 1. stages -> my_stages
stages.sort()
for i in range(1,N+2):
num = stages.count(i)
my_stages.append(num)
# 2. obj
my_obj = {}
for i in range(len(my_stages)-1):
fail_rate = my_stages[i] / sum(my_stages[i:])
my_obj[i+1] = fail_rate
# 3. 정렬
my_obj = dict(sorted(my_obj.items(), key = lambda item:item[1], reverse=True))
# 제출용
for i in my_obj:
answer.append(i)
return answer
그러면 다음과 같이 에러가 뜨게된다. .. ?
일단 하나의 오류를 찾았다.
만약 2번의 케이스를 조금 바꿔서
도달한 사람이 없는 stage 의 경우 실패율 0 으로 간주하게 되는데
N = 5 , stages = [4,4,4,4,4] , return = [4,1,2,3,5] 와 같은 테스트 케이스를 입력시
ZeroDivisionError: division by zero 가 발생하게 된다.
이유는 sum(my_stages[i:]) 부분에서
0 / 0 이 발생하게 되며 이에 대한 처리를 해주어야 된다.
다음과 같이 try - except 구문을 사용하였다.
def solution(N, stages):
answer = []
my_stages = []
# 1. stages -> my_stages
stages.sort()
for i in range(1,N+2):
num = stages.count(i)
my_stages.append(num)
# 2. obj
my_obj = {}
for i in range(len(my_stages)-1):
try:
fail_rate = my_stages[i] / sum(my_stages[i:])
except:
fail_rate = 0
my_obj[i+1] = fail_rate
# 3. 정렬
my_obj = dict(sorted(my_obj.items(), key = lambda item:item[1], reverse=True))
# 제출용
for i in my_obj:
answer.append(i)
return answer