링크🔗
https://www.acmicpc.net/problem/2075
🗒️파이썬 코드 풀이
import sys
import heapq
N = int(input())
heap = []
for _ in range(N):
lst = map(int,sys.stdin.readline().rstrip().split())
for ls in lst:
if len(heap) < N :
heapq.heappush(heap,ls)
else:
if heap[0] < ls:
heapq.heappop(heap)
heapq.heappush(heap,ls)
print(heap[0])
1.이 문제에서 N^2개의 숫자를 모두 배열에 저장하고 조건에 따라 처리하는 방식은 시간 초과가 된다.
2. 입력된 각각의 줄의 값들을 반복문으로 하나 하나 ls에 넣어주고,
우선순위 큐의 크기를 N개로 제한 한 후 ,
ls가 우선순위 큐의 첫번째 인덱스 보다 큰 값이면, 우선순위 큐의 첫번째 인덱스 지우고 바꿔준다.
3. 이렇게 진행하면, 딱 N번째 줄 heap[0]에서 N번째 큰 수를 구할 수 있다.
🚨 heap의 잘 못 된 사용
flat_lst = []
for i in range(N):
for j in range(N):
flat_lst.append(lst[i][j])
heap = [ ]
heapq.heappush(heap,flat_lst[0])
맨 처음에, 받은 입력 값들을 1차원으로 쭉 펼친 flat_lst를 만들고 heap에 넣어주었다.
그리고 heap[0]을 출력해보니 12가 나왔다.
알아보니 flat_lst 리스트 전체를 heap에 추가되기 때문에,
heap의 첫번째요소는 flat_lst의 전체가 되고, 그 리스트의 첫 번째 요소인 12가 출력되는 것이다.
📌문제 코멘드
지난번에 heap 문제를 포스팅 했다.
heappush 할 때 여러개를 한번에 넣어도 되는 줄 알았는데,
그렇게하면 전체를 하나로 보아 최소 힙을 유지하지 못 한다.
그리고 문제를 보고 뭘로 풀어야 할지 몰랐다...
N*N 크기의 N 번째 큰수 라는 문제 설명에 집중하고 ,
이런 경우 heap에 대해서도 생각해보자 .
📚문제
N×N의 표에 수 N2개 채워져 있다. 채워진 수에는 한 가지 특징이 있는데, 모든 수는 자신의 한 칸 위에 있는 수보다 크다는 것이다. 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번째 큰 수를 찾는 프로그램을 작성하시오. 표에 채워진 수는 모두 다르다.
입력
첫째 줄에 N(1 ≤ N ≤ 1,500)이 주어진다. 다음 N개의 줄에는 각 줄마다 N개의 수가 주어진다. 표에 적힌 수는 -10억보다 크거나 같고, 10억보다 작거나 같은 정수이다.
출력
첫째 줄에 N번째 큰 수를 출력한다.
예제 입력 1 복사
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
예제 출력 1 복사
35
'알고리즘 > 알고리즘_백준' 카테고리의 다른 글
[Python][백준] 1927. 문자열 교환 (0) | 2024.07.09 |
---|---|
[Python][백준] 1138.한 줄로 서기 (0) | 2024.07.08 |
[Python][백준] 1927. 최소 힙 (0) | 2024.07.07 |
[Python][백준] 3758. KCPC (0) | 2024.07.06 |
[Python][백준] 19941. 햄버거 분배 (0) | 2024.07.06 |