![[BOJ] 백준 2075 N번째 큰 수 Python](https://img1.daumcdn.net/thumb/R750x0/?scode=mtistory2&fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FvB1MJ%2FbtsFygiuS5B%2FCTSSUV93KbsSxLXd7L8fdk%2Fimg.png)
[BOJ] 백준 2075 N번째 큰 수 Python알고리즘 & 코테2024. 3. 6. 17:03
Table of Contents
2075번: N번째 큰 수
첫째 줄에 N(1 ≤ N ≤ 1,500)이 주어진다. 다음 N개의 줄에는 각 줄마다 N개의 수가 주어진다. 표에 적힌 수는 -10억보다 크거나 같고, 10억보다 작거나 같은 정수이다.
www.acmicpc.net
문제풀이
첫번째 시도) N번째 큰 수를 단순히 최대힙을 만들어 구하려고 했다. 1 ≤ N ≤ 1500 라는 N의 범위값과 12MB라는 메모리 공간 제한 때문에 메모리 제한이 나왔다.
from sys import stdin from heapq import heappush, heappop input = stdin.readline n = int(input()) arr = [] tmp_arr = [] for _ in range(n): tmp_arr = list(map(int, input().split())) for num in tmp_arr: heappush(arr, -num) for _ in range(n): k = heappop(arr) print(k)
✅두번째 시도)
이에 힙의 크기를 항상 N으로 만들어주어서 최소힙의 첫번째 원소보다 큰 원소가 들어오면 교체를 해주면 될거라는 생각이 들었다.
💡그렇게 되면 힙의 크기가 N일때 힙의 첫번째 원소는 N번째 큰 수가 된다.
왜냐하면 힙은 최소힙으로 첫번째 원소 이후에 첫번째 원소보다 N-1개의 큰 수들이 필연적으로 존재하기 때문이다.
from sys import stdin from heapq import heappush, heappop input = stdin.readline n = int(input()) heap = [] for _ in range(n): num_arr = list(map(int, input().split())) if not heap: for num in num_arr: heappush(heap, num) else: for num in num_arr: if num > heap[0]: heappush(heap, num) heappop(heap) print(heappop(heap))
🧠알고리즘
1. 힙이 비어있을 땐 배열을 무조건 힙에 push한다.
2. 이렇게 될 경우 첫시행이 끝난 후 힙에는 반드시 N개의 원소가 차있는데 이 때 첫번째 원소와 새로 들어오는 입력에 대해서 비교를 진행한후 힙을 갱신한다.
3. 힙의 첫번째 원소(N번째 큰 수)를 출력한다.
'알고리즘 & 코테' 카테고리의 다른 글
[BOJ] 백준 9251 LCS Python (1) | 2024.01.11 |
---|---|
[BOJ] 백준 11053 가장 긴 증가하는 부분 수열 Python (0) | 2024.01.11 |
[BOJ] 백준 2225 합분해 Python (0) | 2024.01.10 |
[BOJ] 백준 2293 동전 1 Python (1) | 2024.01.10 |
[BOJ] 백준 11726 2xn 타일링 Python (0) | 2024.01.09 |
@Indigochi1d :: Indigochi1d's Commit Log
안녕하세요? 개발자입니다.