상세 컨텐츠

본문 제목

[Python] 실패율

알고리즘 공부

by 독서와 여행 2021. 4. 16. 22:20

본문

뭔가 기능주의 같은 내 코드

통과한 코드는 아니다. 열심히 고쳐야지. 일단 너무 지저분해

class Stage_num:
    def __init__(self,num,fail_ratio):
        self.num = num
        self.fail_ratio = fail_ratio

def solution(N, stages):
    stages = sorted(stages)
    answer = []
    to_sort = []
    stage_index = 0
    for current_stage in range(1, N + 1): 
        for i in range(stage_index,len(stages)):
            if(stages[i] > current_stage): # 뒤에 더 큰 것이 안나오면 해결x
                to_sort.append(Stage_num(current_stage,len(stages[stage_index: i]) / len(stages[stage_index :])))
                stage_index = i
                break 
            if(i == len(stages) - 1) : #배열 끝 까지 더 큰게 안나옴!
                to_sort.append(Stage_num(current_stage,len(stages[stage_index: i])/ len(stages[stage_index :])))
                stage_index += 1 # 더이상 밑에 for문 못 돌게
    
    if len(to_sort) != N: # N만큼 들어갔니 to_sort에 들어갔니? 뒤에 더 큰 것 나왔을 때 pass해버리니까
        while len(to_sort) != N:
            to_sort.append(Stage_num(len(to_sort) + 1 , 0))
            
             
    for i in sorted(to_sort, key = lambda x: x.fail_ratio, reverse= True):
        answer.append(i.num)
        # 인덱스로 더 큰 거 있는지 보고, 남은 크기만큼 빼서 저장해 둠
    return answer

 

하... 일단 풀기는 풀었다. 

최대한 주석을 많이 달아서 풀었다. 

까먹을까봐... for문 밖에서 차라리 추가를 하자는 생각이 들어서

지하철에서 풀었다. 다른 사람의 코드를 한 번 봐야지

 

def solution(N, stages):
    stages = sorted(stages)

    index = 0 # 스테이지 저장용
    answer = [[i,0] for i in range(1,N + 1)] #일단은 스테이지 초기화

    for stage in range(1,N + 1): # 스테이지 for문
        for num in range(index, len(stages)): # stages가 정렬되어있으니 인덱스 저장해서 그 인덱스부터 돌면됨
            if (stage < stages[num]): # 만약 1단계면 현재 1단계에 있는 사람들이 있나 확인 근데 [2,3,4,5] 라면 if문에 걸림 바로 종료
                break                                               
        if len(stages) - 1 == num and stage >= stages[num]: # for문 빠져 나와서 정리 for문 내에서 해버리면 끝까지 갔을 때 해결 방안이 어려움 ex 5, (1,2,2,3,3,4,4) // 
            #4 (4,4,4,4) 이러면 stage[num] 중에 자기보다 큰거 안나와서 그냥 pass됨 그렇다고 tru false로 돌린다? 그럼 첫 사례같은 경우 4도 뒤에 되고 5는 아에 나오지도 않았는데 들어가게됨
            #
            answer[stage-1][1] = (num - index + 1)/len(stages[index:])
            index = num + 1
            break #이거 안해주면 첫번째 for문이 돌아서 5(4,4,4,4) 이렇게 있다고 한다면 N = 5 일때 if문에 걸려서 /0으로 걸리는 오류 발생.
                  #애초에 인덱스 끝나버린거면 그 뒤는 안나오는거니까 0이 되는거임 
        
        else: 
            answer[stage-1][1] = (num - index )/len(stages[index:])
            index = num 

    # if(not end):
    #     answer[stage-1][1] = (num - index + 1)/len(stages[index:]) #end 가 false 일 경우 그래서 한 번 더 for문 돌림
    
    answer = sorted(answer,key= lambda x:x[1], reverse=True) # 스테이지 통과율로 정렬

    solve = []
    for i in answer:
        solve.append(i[0])


    return solve

 

다른 사람의 풀이 이다. 

dict을 사용하였다.

def solution(N, stages):
    fail_rate = {}
    total_user = len(stages)

    for stage in range(1, N+1):
        if total_user != 0:
            fail_user = stages.count(stage)
            fail_rate[stage] = fail_user / total_user
            total_user -= fail_user
        else:
            fail_rate[stage] = 0

    return sorted(fail_rate, key=lambda x : fail_rate[x], reverse=True)

 

아.. 멍청이 dic[1] = b 이건 {1 : b} 이렇게 되는걸 까먹은건지 모른건지 그랬다. 그래서 왜 dic을 쓰나 했네...

되게 깔끔하게 잘 풀었다. 특히 count 사용이 좋았어..

관련글 더보기

댓글 영역