🆀 문제
전체 스테이지의 개수 N, 게임을 이용하는 사용자가 현재 멈춰있는 스테이지의 번호가 담긴 배열 stages가 매개변수로 주어질 때, 실패율이 높은 스테이지부터 내림차순으로 스테이지의 번호가 담겨있는 배열을 return 하도록 solution 함수를 완성하라.
🆂 풀이
#try 1
def solution(N, stages):
fail = {} #dict
for i in range(1, N+1):
if i not in stages:
fail[i] = 0
else:
fail[i] = stages.count(i) / len(stages)
while i in stages:
stages.remove(i)
ans = sorted(fail.items(), key = lambda x: x[1], reverse = True)
return([ans[i][0] for i in range(N)])
딕셔너리를 이용해 stages마다 개수를 대응되게 저장하고 value를 기준으로 내림차순 정렬하였다. 반환은 stages의 레벨인 key 값으로 했다.
그러나 이 코드는 테스트케이스는 통과하고 제출에서는 타임아웃이 되었다. 내 코드에서는 count()나 remove() 그리고 반복문 등이 너무 많아서 타임아웃이 되는 것 같았다.
#try 2
def solution(N, stages):
fail = {} #dict
giri = len(stages)
for i in range(1, N+1):
cnt = stages.count(i)
if cnt == 0:
fail[i] = 0
else:
fail[i] = cnt/ giri
giri -= cnt
ans = sorted(fail.items(), key = lambda x: x[1], reverse = True)
return ([ans[i][0] for i in range(N)])
len()을 for문 밖으로 빼서 전체 스테이지의 길이를 한 번만 계산하게 하였다. 그러면 자연스럽게 while 반복문과 remove()의 사용도 줄일 수 있다. 그리고 count()의 반복을 줄이기 위해서 cnt 변수를 사용했다.
🅿 더 알아보기
다른 사람의 풀이를 보니 내가 쓴 마지막 2줄을 한 줄 안에도 표현할 수 있었다.
내 코드 :
ans = sorted(fail.items(), key= lambda x: x[1], reverse=True)
return ([ans[i][0] for i in range(N)])
fail.items()로 (스테이지 번호, 실패율) 형식의 튜플을 반환하고, lambda x: x[1]로 실패율에 따라 정렬해 튜플 리스트 ans 생성. for 반복문으로 ans에서 스테이지 번호(ans[n][0])만 출력.
다른 사람 코드 :
return sorted(fail, key= lambda x : fail[x], reverse=True)
- 대상 : fail만 쓰면 key만 정렬 대상에 들어간다.
- 기준 : lambda x: fail[x] x에 fail의 스테이지 번호(key)이 들어가 실패율(value)를 반환하기 때문에 실패율에 따라 정렬할 수 있게 한다.
- 반환 : 내림차순 정렬되어 fail의 키 값만 들어간 리스트가 반환된다. (sorted 함수의 결과는 항상 리스트)
- 시간 복잡도 : 연산의 개수를 세어 로직의 효율을 분석하는데 사용
- lambda (매개변수 : 표현식) : 익명 함수. 선언 또는 이름 없이 함수 사용 가능
lambda x: -x[1] : reverse와 같은 효과
lambda x: (x[1], x[0]) : 다중조건 정렬 가능
'기타 문제 풀이' 카테고리의 다른 글
| [백준] 1181 단어 정렬 (0) | 2025.05.18 |
|---|---|
| [백준] 11931 수 정렬하기 4 (0) | 2025.05.12 |
| [백준] 24262~7 시간 복잡도 (0) | 2025.04.08 |
| [백준] 10171, 10172 고양이와 개 (4) | 2024.12.24 |
| [백준] 2743 단어 길이 재기 (1) | 2024.11.22 |