Notice
Recent Posts
Recent Comments
Link
«   2024/12   »
1 2 3 4 5 6 7
8 9 10 11 12 13 14
15 16 17 18 19 20 21
22 23 24 25 26 27 28
29 30 31
Archives
Today
Total
관리 메뉴

0과 1 사이

[파이썬(python)] 정렬 문제 실패율 본문

코딩테스트

[파이썬(python)] 정렬 문제 실패율

고후 2022. 1. 19. 18:32

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

 

코딩테스트 연습 - 실패율

실패율 슈퍼 게임 개발자 오렐리는 큰 고민에 빠졌다. 그녀가 만든 프랜즈 오천성이 대성공을 거뒀지만, 요즘 신규 사용자의 수가 급감한 것이다. 원인은 신규 사용자와 기존 사용자 사이에 스

programmers.co.kr

모든 스테이지에 대한 실패율을 계산하고 각 번호를 실패율의 내림차순으로 정렬하는 문제이다

 

실패율까지 잘 계산했는데...

그러나 실패율의 내림차순으로 리스트를 출력하는 방법을 잘 모르겠더라.

 

원래 코드

def solution(N, stages):
    rate_list = []

#실패율 리스트
    stages.sort()

#오름차순 정렬
    for i in range(1,N+1):
        count_i = stages.count(i) #클리어하지 못한 사람 수

        count_try = 0 #도전한 사용자 수
        for j in stages:
            if j>=i:
                count_try += 1
        rate = count_i/count_try
        rate_list.append(rate) #리스트에 실패율 추가

    sort_list = sorted(rate_list, reverse=True)
        
    print(sort_list)
    print(rate_list)
    return answer

음 ... 내림차순 정렬하기 전의 배열과 정렬한 뒤의 배열을 비교해서 다시 리스트를 만들어야 하나 고민하다가 아무래도

이게 아닌 것 같아 생각해봤다

답은 매우 간단 ㅜㅜ 리스트에 실패율과 스테이지번호를 리스트로 추가한 뒤에 실패율 순으로 내림차순 정렬하면 된다

 

def solution(N, stages):
    rate_list = []
    answer = []
    stages.sort()
    for i in range(1,N+1):
        count_i = stages.count(i)
        count_try = 0
        for j in stages:
            if j>=i:
                count_try += 1
        rate = count_i/count_try
        rate_list.append([rate, i])
    rate_list.sort(key = lambda x:x[0], reverse=True)
    
    answer = [i[1] for i in rate_list]
    
    return answer

 

그러나 런타임 에러로 인해 100점 중에 70점 밖에 못받았다.  시간 복잡도가 N*N이고 공간 복잡도도 두개의 배열을 사용해서 그런듯 하다. 실패율을 조금 더 효율적으로 계산하는 방법을 생각해봐야겠다.

 

개선한 코드는 answer 배열 하나만 이용하고 count_try 계산하는 것도 단순화 했다.

 

def solution(N, stages):
    answer = []
    count_try = len(stages)
    for i in range(1,N+1):
        count_i = stages.count(i)
        rate = count_i/count_try
        answer.append([rate, i])
        count_try -= count_i
        
    answer.sort(key = lambda x:x[0], reverse=True)
    
    answer = [i[1] for i in answer]
    
    return answer

 

근데 이것도 런타임 에러남.. ㅜㅜ 다시 보니 count_try가 0일 경우에 런타임에러가 나는 것이었다

 

최종 코드는 이것이다. 공부하기에 아주 좋은 문제였던 것 같다

def solution(N, stages):
    answer = []
    count_try = len(stages)
    for i in range(1,N+1):
        count_i = stages.count(i)
        if count_try == 0:
            rate = 0
        else:
            rate = count_i/count_try
        answer.append([rate, i])
        count_try -= count_i
        
    answer.sort(key = lambda x:x[0], reverse=True)
    
    answer = [i[1] for i in answer]
    
    return answer
Comments