연습장

13. 실패율 본문

프로그래머스/1단계

13. 실패율

js0616 2023. 12. 16. 19:01

 

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

'프로그래머스 > 1단계' 카테고리의 다른 글

15. 이웃한 칸  (0) 2024.01.17
14. 둘만의 암호  (0) 2024.01.17
12. 덧칠하기  (0) 2023.12.16
11. 소수 찾기  (1) 2023.12.15
10. 카드 뭉치  (0) 2023.12.15