티스토리 뷰
반응형
백준 N번째 큰 수 2075 Python
문제 설명
문제
N×N의 표에 수 N²개가 채워져 있습니다. 채워진 수에는 한 가지 특징이 있는데, 모든 수는 자신의 한 칸 위에 있는 수보다 크다는 것입니다. N=5일 때의 예시는 다음과 같습니다.
12 7 9 15 5
13 8 11 19 6
21 10 26 31 16
48 14 28 35 25
52 20 32 41 49
이러한 표가 주어졌을 때, N번째 큰 수를 찾아야 합니다. 표에 적힌 수는 모두 다릅니다.
테스트케이스
입력:
5
12 7 9 15 5
13 8 11 19 6
21 10 26 31 16
48 14 28 35 25
52 20 32 41 49
출력:
35
작동원리
N×N의 모든 수 중 N번째로 큰 값을 찾기 위해, 모든 값을 다 정렬하는 방법도 있지만, 메모리와 시간을 절약하기 위해 최소 힙(min-heap)을 활용합니다.
- 최소 힙은 항상 가장 작은 값이 맨 위에 오도록 유지됩니다.
- 모든 값을 읽으면서 힙에 삽입하되, 힙의 크기를 N으로 제한합니다.
- 크기가 N을 초과하면, 힙의 맨 위(가장 작은 값)를 제거합니다.
- 이렇게 하면 힙 안에는 항상 지금까지 읽은 값 중 가장 큰 N개가 남게 됩니다.
- 마지막에 힙의
arr[0]
을 출력하면, 그 값이 전체 중 N번째 큰 값입니다. - 즉, 정렬 없이도 N번째 큰 값을 구할 수 있습니다.
아이디어
- 모든 원소를 최소 힙에 하나씩 넣습니다.
- 힙의 크기를 항상 N으로 유지합니다.
- 힙에 원소를 넣을 때마다 크기가 N을 초과하면
heappop()
을 실행하여 가장 작은 원소를 제거합니다. - 이렇게 하면 힙 내부에는 항상 상위 N개의 값만 남습니다.
예를 들어, N=3이고 입력이 [5, 1, 9, 3, 10, 7, 6, 2, 8]
이라면:
- 처음 3개(5, 1, 9)를 넣으면 힙 = [1, 5, 9] (1이 top)
- 다음 값 3 → 크기 초과 시 1 제거, 힙 = [3, 5, 9]
- 다음 값 10 → 3 제거, 힙 = [5, 9, 10]
- 다음 값 7 → 5 제거, 힙 = [7, 10, 9]
- 다음 값 6 → 6은 top(7)보다 작으므로 무시하는 대신, 코드에서는 일단 넣고 pop
- 마지막 값 8 → top(7) 제거, 힙 = [8, 10, 9]
최종 힙의 top은 8, 즉 전체 중 3번째 큰 값입니다.
이런 방식은 모든 값을 정렬하는 O(N² log N²)보다 훨씬 빠른 O(N² log N) 시간에 N번째 큰 값을 찾을 수 있습니다.
전체코드
import heapq
N=int(input())
arr=[]
for i in range(N):
k=list(map(int,input().split()))
for j in k:
heapq.heappush(arr,j)
if(len(arr)>N):
heapq.heappop(arr)
print(arr[0])
결론
이 문제는 N²개의 수 중 N번째 큰 값을 구하는 문제로, 모든 수를 정렬하는 대신 크기 N의 최소 힙을 사용하면 효율적으로 해결할 수 있습니다.
힙의 크기를 N으로 유지하면서 입력을 처리하면, 힙 안에는 항상 가장 큰 N개의 수가 남게 되고, 그 중 최소값이 전체에서 N번째 큰 값이 됩니다.
이 방식은 시간 복잡도가 O(N² log N)으로, 제한 시간 내에 충분히 동작하며 메모리 사용도 최소화됩니다.
반응형
'백준 스터디' 카테고리의 다른 글
백준 2512 예산 파이썬 문제 (4) | 2025.08.16 |
---|---|
백준 2512 예산 C++, (1) | 2025.08.16 |
백준 2075번 N번째 큰 수 C++ (0) | 2025.08.15 |
백준 20125 쿠키의 신체 측정 Python (7) | 2025.08.15 |
백준 20125 쿠키의 신체 측정 C++ (1) | 2025.08.15 |
공지사항
최근에 올라온 글
최근에 달린 댓글
- Total
- Today
- Yesterday
링크
TAG
- python 알고리즘
- 동적계획법
- C++ 알고리즘
- 브루트포스
- 알고리즘기초
- 코딩 테스트
- 알고리즘
- 동적 계획법
- 파이썬코딩
- 그리디
- 프로그래밍
- 파이썬
- 코딩
- 그래프 탐색
- 문자열처리
- 알고리즘문제풀이
- Python
- C++
- DP
- c++알고리즘
- 인접 행렬
- 코딩테스트
- 객체지향
- 알고리즘 문제풀이
- 그리디알고리즘
- dfs
- 문제풀이
- c언어
- 문제 풀이
- 백준
일 | 월 | 화 | 수 | 목 | 금 | 토 |
---|---|---|---|---|---|---|
1 | 2 | 3 | 4 | 5 | 6 | |
7 | 8 | 9 | 10 | 11 | 12 | 13 |
14 | 15 | 16 | 17 | 18 | 19 | 20 |
21 | 22 | 23 | 24 | 25 | 26 | 27 |
28 | 29 | 30 |
글 보관함
반응형