문제) 실패율
코딩테스트 연습 - 실패율
실패율 슈퍼 게임 개발자 오렐리는 큰 고민에 빠졌다. 그녀가 만든 프랜즈 오천성이 대성공을 거뒀지만, 요즘 신규 사용자의 수가 급감한 것이다. 원인은 신규 사용자와 기존 사용자 사이에 스
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
'코딩테스트 > 프로그래머스' 카테고리의 다른 글
| [프로그래머스] [Level 1] 최소직사각형 (0) | 2022.03.17 |
|---|---|
| [프로그래머스] [Level 1] 나머지가 1이 되는 수 찾기 (0) | 2022.03.10 |
| [프로그래머스] [Level 1] 부족한 금액 계산하기 (0) | 2022.03.09 |
| [프로그래머스] [Level 1] [2018 KAKAO BLIND RECRUITMENT] [1차] 비밀지도 (0) | 2022.03.08 |
| [프로그래머스] [Level 1] 2016년 (0) | 2022.03.08 |