오늘은 여기까지
[프로그래머스] 실패율 - 파이썬 Python 본문
https://school.programmers.co.kr/learn/courses/30/lessons/42889
프로그래머스
코드 중심의 개발자 채용. 스택 기반의 포지션 매칭. 프로그래머스의 개발자 맞춤형 프로필을 등록하고, 나와 기술 궁합이 잘 맞는 기업들을 매칭 받으세요.
programmers.co.kr
1. 처음 풀이
def solution(N, stages):
fail = {}
for i in range(1, N+1):
win_cnt, challenge_cnt = 0, 0
for s in stages:
if s > i:
win_cnt+=1
challenge_cnt+=1
elif s == i:
challenge_cnt+=1
if challenge_cnt != 0:
fail[i] = (challenge_cnt - win_cnt) / challenge_cnt
else:
fail[i] = 0
answer = sorted(fail, key=lambda x: (-fail[x], x))
return answer
제한에 애매하게 통과하길래 다른 풀이를 참고해서 개선할 수 있는지 찾아봤다.
2. 시간 복잡도 개선한 코드
def solution(N, stages):
# 각 스테이지별 도전자 수를 먼저 계산
challenge_cnt = [0] * (N + 2)
for stage in stages:
challenge_count[stage] += 1
# 실패율 계산
total_players = len(stages)
fail = {}
for i in range(1, N + 1):
if total_players == 0:
fail[i] = 0
else:
fail[i] = challenge_cnt[i] / total_players
total_players -= challenge_cnt[i]
answer = sorted(fail, key=lambda x: (-fail[x], x))
return answer
i. 스테이지 카운팅
- 1번 코드: 각 스테이지마다 모든 플레이어를 순회한다. `O(N*len(stages))`
- 2번 코드: 플레이어를 한 번만 순회하여 각 스테이지의 도전자 수를 계산한다. `O(len(stages))`
ii. 실패율 계산
- 각 스테이지마다 계산하는 점에서 동일하다. `O(N)`
iii. 정렬
- 동일한 정렬 로직을 사용한다. `O(NlongN)`
iv. 최종 시간 복잡도
- 1번 코드: `O(N*len(stages))`
- 2번 코드: `O(len(stages) + N + NlongN)`
- 대규모 입력 시에는 2번 코드가 훨씬 효율적일 것이다. 특히 N과 len(stages)가 모두 큰 경우일수록 2번 코드가 효율적일 것이다.
'Problem Solving' 카테고리의 다른 글
[백준] 부분수열의 합 - 파이썬 Python (1) | 2024.10.08 |
---|---|
[프로그래머스] 방문 길이 - 파이썬 Python (0) | 2024.10.08 |
[백준] 두 스티커 - 파이썬 Python (1) | 2024.10.07 |
[백준] 숫자 야구 - 파이썬 Python (3) | 2024.10.03 |
[백준] 용액 - 파이썬 Python (1) | 2024.10.01 |