https://www.acmicpc.net/problem/25305
📌 문제 탐색하기
목표
- n명의 응시자 점수 중 상위 k명을 선별
- 상을 받을 사람 중 가장 낮은 점수(커트라인)을 출력
입력값
- 응시자의 N(1 ≤ N ≤ 1000), 상 받는 사람의 수 k(1 ≤ k ≤ N)
- 각 학생의 점수 $x$ (0 ≤ $x$ ≤ 10000)
- 한 줄에 공백을 주고 주어짐.
출력값
- 상을 받는 커트라인 점수
📌 코드 설계하기
해결 아이디어
- 점수 리스트를 내림차순으로 정렬
- k-1번 인덱스를 가진 점수 출력
📌 정답 코드
n, k = map(int, input().split())
arr = list(map(int, input().split()))[:n]
arr.sort(reverse=True)
# print(arr)
print(arr[k-1])
시간 복잡도 계산해보기
- 입력 처리
- map(int, input().split()) → O(N)
- 슬라이싱 [:n] → O(N)
- 합치면 O(N)
- 정렬
- arr.sort(reverse=True) → 파이썬 내장 함수로 평균/최악 시간 복잡도 → O(N log N)
- k번째 요소 출력
- 인덱스 접근 → O(1)
최종 시간 복잡도: O(N log N)
다른 풀이
- 힙 이용하기
- 완전이진트리 형태의 자료구조
- 항상 부모 노드 ≤ 자식 노드(최소힙) 혹은 부모 노드 ≥ 자식 노드(최대힙) 조건을 만족
- root에는 항상 가장 작은 값(최소힙) 또는 가장 큰 값(최대힙)이 존재
- 만약 최대힙을 쓰고 싶다면 모든 값을 음수로 변환해서 저장하면 된다.
- heapq의 특징
- 내부적으로 List를 이용해서 힙을 구현한다.
- 값이 들어올 때마다 O(log n) 시간에 자동으로 정렬된 힙 상태를 유지한다.
import sys
import heapq
n, k = map(int, input().split())
scores = list(map(int, input().split()))[:n]
heap = []
for score in scores:
if len(heap) < k:
heapq.heappush(heap, score)
else:
if score > heap[0]:
heapq.heapreplace(heap, score)
print(heap[0])
'개발 > python' 카테고리의 다른 글
[백준 7568번] 덩치 - python (2) | 2025.08.17 |
---|---|
[백준 2947번] 나무 조각 - python (1) | 2025.08.16 |
[백준 1181번] 단어 정렬 - python (3) | 2025.08.14 |
[백준 1181번] 단어 정렬 - python (3) | 2025.08.13 |
[백준 10814번] 나이순 정렬 - python (0) | 2025.08.12 |