def solution(N, stages):
# counter 초기화
counter = {i:0 for i in range(N+2)}
# counter 생성
for i in stages:
counter[i] += 1
# 실패율 계산
arr = []
a = len(stages)
for s in range(1, N+1):
a = a - counter[s-1]
b = counter[s]
if a ==0:
rate = 0
else:
rate = b / a
arr.append((s, rate))
print(s, a, b)
# 실패율 높은 순서대로 정렬
arr.sort(key = lambda x:x[1], reverse = True)
# 리턴값 형식으로 만들기
returns = []
for i in arr:
returns.append(i[0])
return returns
실패율
=
stages
를 이용하여 각 스테이지에 도달한 플레이어 수를 나타내는 딕셔너리 counter
를 만든다. 아래는 예시이다.
입출력 예시
N | stages | result |
---|---|---|
5 | [2, 1, 2, 6, 2, 4, 3, 3] | [3, 4, 2, 1, 5] |
stages
게임을 이용하는 사용자가 현재 멈춰있는 스테이지의 번호가 담긴 배열
stages = [2, 1, 2, 6, 2, 4, 3, 3]
counter
= {스테이지 번호: 해당 스테이지에 도달해있는 사용자 수}
counter = {
1: 1,
2: 3,
3: 2,
4: 1,
5: 0,
6: 1
}
간단하게 표현하기 위해,
실패율 = = 라고 가정한다.
전체 스테이지의 개수가 5인 게임의 스테이지 1의 실패율을 구해보자.
a = counter[1] + counter[2] + ... + counter[6]
= stages 배열의 길이(전체 플레이어 수)
b = counter[1]
스테이지 2의 실패율을 구해보자.
a = counter[2] + ... + counter[6]
= 스테이지 1의 a값 - counter[1]
b = counter[2]
스테이지 3의 실패율을 구해보자.
a = counter[3] + ... + counter[6]
= 스테이지 2의 a값 - counter[2]
b = counter[3]
따라서 실패율은 다음과같이 정의할 수 있다.
실패율 =
(a는 이전 스테이지의 a값, a의 초기값은 전체 플레이어 수)
최종적으로 리턴하는 값은 실패율이 높은 스테이지 번호들이므로,
(스테이지번호, 실패율)
의 형식으로 배열에 저장한다.
arr.append((s, rate))
정렬 조건
이전의 실패율을 구하는 for문에서는 스테이지 1부터 스테이지 N까지의 실패율을 순서대로 배열에 저장하였다.
이미 작은번호의 스테이지부터 정렬된 상태이므로 실패율이 높은 순서대로만 정렬해주면 된다.
# 실패율 높은 순서대로 정렬
arr.sort(key = lambda x:x[1], reverse = True)
최종 리턴되는 값은 실패율이 아니다. 실패율이 높은 스테이지부터 내림차순으로 스테이지의 번호가 담겨있는 배열을 리턴해준다.
# 리턴값 형식으로 만들기
returns = []
for i in arr:
returns.append(i[0])
return returns
알고리즘 자체는 어렵지 않게 생각해낼 수 있었지만, 이것을 코드로 구현하는 것이 어려웠다. 실패율을 기준으로 정렬하지만, 최종적으로 구하는 값은 실패율이 아닌 스테이지 번호여서 이 두가지의 값을 함께 저장하는 방법에 대해 고민이 필요했다.