코딩테스트
[백준] 커트라인
져니01
2025. 3. 7. 21:09
문제보기 - https://www.acmicpc.net/problem/25305
문제명 - 커트라인
난이도 - B2
문제유형 - 구현
풀이일자 - 25.03.07
📌 문제 탐색하기
- 응시자 수 N과 상을 받는사람 수 k를 공백을 사이에 두고 입력받음
- 1 ≤ N ≤ 1000, 1 ≤ k ≤ N
- 각 학생의 점수 x를 공백을 두고 입력받음
- 0 ≤ x ≤ 10000
- 상을 받는 커트라인(상위 k번째 점수)을 출력해야 함.
🛠 시간복잡도 확인
- 이 최대 1000 이므로 정렬 가능
- 정렬을 위해 sort() 사용 -> O(N log N)
- 최종 시간 복잡도: O(N log N)
📌 코드 설계하기
- 응시자 수 N과 상을 받는 사람 수 k 입력받기
- map(int, sys.stdin.readline().split()) 활용
- 점수 리스트를 입력받아 내림차순 정렬
- sort(reverse=True) 사용
- k번째 점수 출력
- scores[k-1] 사용
📌 정답 코드(1회차)
import sys
# 1. 응시자 수 N과 상을 받는 사람 수 k 입력받기
N,k = map(int, sys.stdin.readline().split())
# 2. 점수 리스트를 입력받아 내림차순 정렬
scores = list(map(int, sys.stdin.readline().split()))
scores.sort(reverse=True)
# 3.k번째 점수 출력
print(scores[k-1])
📌 추가정리
map(int, sys.stdin.readline().split()) vs list(map(int, sys.stdin.readline().split()))
표현 | 특징 | 메모리 사용 | 인덱싱 가능 여부 | 사용 가능 횟수 |
map(int, sys.stdin.readline().split()) | 이터레이터 (한 번만 사용 가능) |
적음 (메모리 효율적) |
❌ (인덱싱 불가) | 1회 (사용 후 소멸) |
list(map(int, sys.stdin.readline().split())) | 리스트 변환 (여러 번 사용 가능) |
많음 (전체 데이터 저장) |
✅ (인덱싱 가능) | 무제한 (반복 사용 가능) |
🔹 차이점 요약
- map()만 사용하면 -> 메모리를 아끼지만, 한 번만 순회 가능하고 scores[0] 같은 인덱싱이 불가능.
- list(map())을 사용하면 -> 모든 데이터를 한 번에 저장하여 여러 번 사용할 수 있지만, 메모리를 더 많이 차지함.
💡 추천 방식
- 일반적인 문제 풀이: list(map(int, sys.stdin.readline().split())) 사용 (편리함)
- 데이터 크기가 클 때: map(int, sys.stdin.readline().split()) 사용 (메모리 절약)