프로그래머스
[프로그래머스]실패율
진철
2023. 1. 19. 22:34
728x90
반응형
문제 링크 : https://school.programmers.co.kr/learn/courses/30/lessons/42889
프로그래머스
코드 중심의 개발자 채용. 스택 기반의 포지션 매칭. 프로그래머스의 개발자 맞춤형 프로필을 등록하고, 나와 기술 궁합이 잘 맞는 기업들을 매칭 받으세요.
programmers.co.kr
문제를 간단히 설명하자면 다음과 같다.
숫자 N과 각 유저들의 게임 진행 단계를 나타내는 배열 stages가 주어진다.
만약 유저의 게임 진행 단계가 2라면 1단계는 성공했으나 2단계는 실패한 것이다.
이 때, 각 단계의 실패율을 계산하여 어느 단계가 제일 실패율이 높은지 내림차순으로 정렬한 값을 반환해야 한다.
코드를 작성하기 위한 단계는 다음과 같다.
1. 각 단계를 도전하고 있는 유저는 몇 명인지 계산한다.
2. 1단계부터 실패율을 계산해주고, 딕셔너리에 값을 넣어준다.
3. 1단계를 실패한 유저는 2단계에 도전조차 하지 못하기 때문에 이를 제거해준다.
4. 람다함수를 사용하여 value(실패율)을 기준으로 정렬해준다.
5. 원하는 값은 실패율이 아닌 단계이기 때문에, 단계만 answer에 append해준다.
def solution(N, stages):
answer = []
rate={} #각 단계마다 도전하고 있는 유저 수를 담기 위한 딕셔너리
fail={} #각 단계마다 실패율을 담기 위한 딕셔너리
for i in range(N+1):
rate[i]=0
for i in stages:
rate[i-1]+=1 #1번 : 딕셔너리의 index는 0부터 시작하기 때문에, i-1을 해준다.
total=len(stages)
for i in range(N):
if total==0: #이전 단계의 유저를 빼준 값이 0인 경우, 분모가 0이 되기 때문에 0을 대입해준다.
fail[i]=0
else:
fail[i]=rate[i]/total #2번
total-=rate[i] #3번
sort = sorted(fail.items(), key=lambda x: x[1], reverse=True) #4번
for i in sort:
answer.append(i[0]+1) #5번 : 1번과 동일하게 딕셔너리의 index는 0부터 시작하기에 i+1을 해준다.
return answer
필자의 경우, 처음에는 인원을 빼주는 것을 생각하지 못하고 이중 for문을 돌면서 모두 계산을 해주었더니 런타임에러가 발생하였다.
특정 조건에 맞지 않으면 과감하게 제거해주는 것은 효율성을 높이기 위한 좋은 방법인듯하다.
728x90
반응형