본문 바로가기

알고리즘

프로그래머스/실패율/py

https://school.programmers.co.kr/learn/courses/30/lessons/42889

 

프로그래머스

코드 중심의 개발자 채용. 스택 기반의 포지션 매칭. 프로그래머스의 개발자 맞춤형 프로필을 등록하고, 나와 기술 궁합이 잘 맞는 기업들을 매칭 받으세요.

programmers.co.kr

문제


각 스테이지의 실패율을 계산한후에 실패율이 높은 스테이지 부터 내림차순으로 정렬한 배열을 리턴하라

이때 실패율 = (스테이지에 도달했으나 아직 클리어하지 못한 플레이어의 수 / 스테이지에 도달한 플레이어 수) 이다.

 

입력


스테이지 개수 N = (1 <= N <= 500) , stages len = (1 <= len(stages) <= 200000) , stages 원소 e = (1 <= e <= N+1)

 

출력


내림차순 정렬된 실패율 리스트

 

풀이


각 스테이지의 실패율 = 도달후 못푼 수 / 도달한 수 이므로

 

도달후 못푼 스테이지 는 입력 배열에서 주어진 체류중인 스테이지 번호이다. 따라서 해당번호의 개수를 구하면된다.

도달한 스테이지는 입력 배열 원소값 스테이지의 아래값들모두 이므로 해당 번호들의 개수를 더해주면된다.

 

각 배열을 구한후 해당 식을 적용해 풀면 각 스테이지의 실패율이나오게된다.

 

해당 실패율과 스테이지 번호를 pair 하여 정렬을 한후 스테이지 번호를 답으로 저장하여 리턴하면된다.

 

def solution(N, stages):
    approach = [0 for i in range(N+1)] # 도달한 스테이지들의 개수를 저장하기위한 배열 
    notyet = [0 for i in range(N+1)] # 도달했지만 클리어하지못한 스테이지들의 개수를 저장하기위한 배열
    res = [] # 실패율 저장 리스트 선언
    for stage in stages:
        for i in range(stage): # stages 배열의 원소 값 아래의 스테이지들 즉 이미도달한 스테이지들을
            approach[i] += 1 # 1씩 더해준다.
        notyet[stage-1] += 1 # 배열의 원소 값 즉 도달했지만 클리어하지못한 스테이지의 인덱스에 개수를 더해준다.
    
    for i in range(N):
        if approach[i] == 0: # 제약 조건에 approach 가 0 일경우 실패율은 0이다.
            res.append(0)
            continue
        a = notyet[i] / approach[i] # 실패율 적용
        res.append(a) # 각 스테이지들의 실패율 추가
        
    dicres = {i+1 : res[i] for i in range(len(res))} # 딕셔너리 형식으로 인덱스와 값을 페어한다.
    res2 = sorted(dicres.items(), key = lambda item: item[1],reverse=True) # 정렬한다.
    answer = [i[0] for i in res2] # 정렬된 인덱스를 리턴
    
    return answer # 정답 리턴