본문 바로가기
프로그래밍/알고리즘 문제

[프로그래머스] KAKAO 2018 코딩테스트 - 실패율 (python)

by 잇서니 2019. 9. 2.
반응형

1차시도

import collections
import operator

def solution(N, stages):
    answer = []    
    user_stage=collections.Counter(stages)
    fail={}
    
    for i in range(1,N+1):
        if user_stage[i]==0:
            max_key=i
        else:
            del user_stage[i-1]
            fail[i]=(sum(user_stage.values())/float(user_stage[i]))

    stage_result=sorted(fail.items(), key=operator.itemgetter(1))

    for i in range(len(stage_result)):
        answer.append(stage_result[i][0])
    
    answer.append(max_key)
    
            
    
    
    return answer

 

2차시도 (런타임에러)

import collections
import operator

def solution(N, stages):
    answer = []    
    user_stage=collections.Counter(stages)
    fail={}
    
    for i in range(1,N+1):
        del user_stage[i-1]
        fail[i]=(float(user_stage[i])/sum(user_stage.values()))

    stage_result=sorted(fail.items(), key=operator.itemgetter(1),reverse=True)

    for i in range(len(stage_result)):
        answer.append(stage_result[i][0])
    
    
            
    
    
    return answer

틀린이유

sum(user_stage.values())이 0이 되는 경우를 고려하지 못했습니다.

3차시도(런타임에러)

import collections
import operator

def solution(N, stages):
    answer = []    
    user_stage=collections.Counter(stages)
    fail={}
    
    for i in range(1,N+1):
        del user_stage[i-1]
        fail[i]=(float(user_stage[i])/sum(user_stage.values()))

    answer=sorted(fail, key=lambda k : fail[k], reverse=True)

    
    
            
    
    
    return answer

틀린이유

sum(user_stage.values())이 0이 되는 경우를 고려하지 못했습니다.

 

 

4차시도(5개 케이스 틀림)

import collections

def solution(N, stages):
    answer = []    
    user_stage=collections.Counter(stages)
    fail={}
    
    for i in range(1,N+1):
        del user_stage[i-1]
        if sum(user_stage.values())==0:
            answer=sorted(fail, key=lambda k : fail[k], reverse=True)
            answer.extend([i,N])
            return answer
        fail[i]=(user_stage[i]/sum(user_stage.values()))
        
    answer=sorted(fail, key=lambda k : fail[k], reverse=True)
    
    return answer

틀린 이유

제가 놓친 케이스가 무엇일까요 ㅠㅠ?

 

 

다른 분들의 풀이

def solution(N, stages):
    result = {}
    denominator = len(stages)
    for stage in range(1, N+1):
        if denominator != 0:
            count = stages.count(stage)
            result[stage] = count / denominator
            denominator -= count
        else:
            result[stage] = 0
    return sorted(result, key=lambda x : result[x], reverse=True)

제가 작성한 4차시도 코드와 로직이 같다고 생각하는데, 4차시도 코드에선 왜 틀렸을까요?ㅠㅠ

 

python 개념

1) 리스트에서 특정 값을 가진 요소 개수 count

a=[1,3,2,2]
print(a.count(2))
# 2

2) 딕셔너리 key 기준으로 정렬하기

요소값이 튜플인 리스트가 return 됩니다.

import operator

dict={3:2, 2:1, 1:4}
sdict = sorted(dict.items(), key=operator.itemgetter(0))
print(sdict)

# [(1,4),(2,1),(3:2)]

 

정렬된 딕셔너리에서 key값들만 있는 리스트가 return 됩니다.

sorted(dict, key=lambda k : k, reverse=True)
print(sorted)

#[1,2,3]

3) 딕셔너리 value 기준으로 정렬하기

요소값이 튜플인 리스트가 return 됩니다.

import operator

dict={3:2, 2:1, 1:4}
sdict = sorted(dict.items(), key=operator.itemgetter(1))
print(sdict)

# [(2,1),(3,2),(1:4)]

 

정렬된 딕셔너리에서 key값들만 있는 리스트가 return 됩니다.

sorted(dict, key=lambda k : fail[k], reverse=True)
print(sorted)

#[2,3,1]

4) lambda

def f2(x):
   return x[1]

res = sorted(names.items(), key=f2)
print(res)

#lambda를 사용한 경우
res = sorted(names.items(), key=(lambda x: x[1]), reverse = True)
print(res)

 

반응형

댓글