알고리즘/알고리즘_백준

[Python][백준] 2075. N번째 큰 수

Jerry_K 2024. 7. 8. 11:22

링크🔗

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