코딩테스트/프로그래머스

[프로그래머스] [2019 KAKAO BLIND RECRUITMENT] 실패율

박소민 2022. 3. 9. 18:48
문제) 실패율
 

코딩테스트 연습 - 실패율

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

programmers.co.kr

 

  • 내 풀이
  • 1트 (런타임 에러)
def solution(N, stages):
    st = [0]*501
    fail={}
    l=len(stages)
    for i in stages:
        st[i]+=1
    for j in range(1,N+1):
        fail[j]=st[j]/l
        l-=st[j]
    #딕셔너리 value값 기준으로 내림차순 정렬
    answer= [i[0] for i in (sorted(fail.items(), reverse=True,key=lambda item: item[1]))]
    
    return answer
  • 2트 (런타임 에러)
    •  범위가 1<=N<=500 , 1<=stages<=200000 이기 때문에 범위가 큰 stages만큼 도는 for문을 줄임
    • count()함수 사용하여 값의 개수 세는 것으로 변경
    • 그래도 런타임 에러가 남
    • 에러 원인: ZeroDivisionError: division by zero
def solution(N, stages):
    fail={}
    l=len(stages)
    for i in range(1,N+1):
        fail[i]=stages.count(i)/l
        l-=stages.count(i)
    #딕셔너리 value값 기준으로 내림차순 정렬
    answer= [j[0] for j in (sorted(fail.items(), reverse=True,key=lambda item: item[1]))]
    
    return answer
  • 3트- 성공!!
    • 맨 마지막 스테이지까지 도달한 사람이 없을 경우 stages.count()값이 0 이 되어 나누지 못해 런타임 에러가 났다.
    • 테스트 케이스 N=4, stages=[1,2,3,2,1], Output=[3,2,1,4] 추가
    • if문으로 스테이지에 도달한 유저가 없는 경우 따로 정의
def solution(N, stages):
    fail={}
    l=len(stages)
    for i in range(1,N+1):
        #맨마지막 스테이지까지 도달한 사람이 없을 경우
        if l<=0:
            fail[i]=0
            continue        
        fail[i]=stages.count(i)/l
        l-=stages.count(i)

    #딕셔너리 value값 기준으로 내림차순 정렬
    answer= [j[0] for j in (sorted(fail.items(), reverse=True,key=lambda item: item[1]))]
    
    return answer

 

 

  • 다른 사람 풀이
    • 📍 sorted()에 딕셔너리 자체를 바로 넘기면 dic.keys()가 들어감 (keys는 생략 가능)
    • key값을 x로 받아 정렬 기준을 dic[x]로 하면 value값 기준으로 정렬 
    • → 다시 for문으로 key값을 구할 필요 없음
def solution(N, stages):
    fail={}
    l=len(stages)
    for i in range(1,N+1):
        #맨마지막 스테이지까지 도달한 사람이 없을 경우
        if l<=0:
            fail[i]=0
            continue        
        fail[i]=stages.count(i)/l
        l-=stages.count(i)

    #딕셔너리만 쓰면 자동으로 dic.keys() 불러옴, dic[key]로 value값 기준으로 정렬
    answer= sorted(fail, key=lambda x: fail[x], reverse=True,)
    
    return answer

 

 

  • 다른 사람 풀이2
    • 리스트만 이용한 풀이 
    • 시간 단축
    • append() 함수에는 하나의 값만 들어갈 수 있으므로 (i+1, 0) 하나로 묶어서 넣는 것 주의!
def solution(N, stages):
    answer=[]
    fail=[]
    info=[0]*(N+2)
    for stage in stages:
        info[stage]+=1
    for i in range(N):
        #스테이지에 도달한 유저 수 합산
        be=sum(info[i+1:])
        yet=info[i+1]
        if be==0:
            fail.append((i+1,0))
        else:
            fail.append((i+1,yet/be))
    for j in sorted(fail, key=lambda x: x[1], reverse=True):
        answer.append(j[0])
    
    return answer