[BOJ] 2461 대표선수 - Python
2021. 7. 26. 22:14ㆍProgramming/Problem Solving
728x90
https://www.acmicpc.net/problem/2461
2461번: 대표 선수
입력의 첫 번째 줄에는 학급의 수를 나타내는 N과 각 학급의 학생의 수를 나타내는 M이 하나의 빈칸을 사이에 두고 주어진다. 단, 1 ≤ N, M ≤ 1,000이다. 두 번째 줄부터 N개의 줄에는 각 줄마다 한
www.acmicpc.net
참으로 고생 많았던 문제다..
어떻게 풀어야할지 감도 안잡혀서 일단 종이와 펜을 들었다.
그리고 위 예제를 봤다
3 4
12 16 67 43
7 17 68 48
14 15 77 54
음.. 12를 먼저 선택하고 다음줄부터 7 , 17 , 68 ... 이렇게 탐색을 한다?
N^3 이 나올 것이다. 1000이니까.. 10억?? 택도없네
한번 정렬을 해보자
3 4
12 16 43 67
7 17 48 68
14 15 54 77
음.. 먼저 맨 앞에 12, 7, 14 로 팀을 한다고 생각을 해보자.
그러면 14 - 7 해서 7이 답이 될 것이다.
근데 오름차순 정렬을 했으니 여기서 제일 작은 값인 7이 있는 줄!! 여기 바로 옆의 17을 선택한다
그럼 팀이 12, 17, 14 가 되겠지? 그럼 다시 여기서 17-12 해서 5!! 이렇게 점점 줄여나갈 수 있다.
이렇게 하면 N*M 개 만큼 보고 heap에 넣고 빼는 logN 만큼 O(NMlogN) 가 되겠다.
import heapq
N, M = map(int, input().split())
arr = []
ind = [1] * 1001 # 몇번째 인덱스에 있는 배열을 선택할 건지
maxVal = 0
hq = []
for i in range(N):
li = list(map(int, input().split()))
li.sort()
maxVal = max(maxVal, li[0])
arr.append(li)
heapq.heappush(hq, (arr[i][0], i))
res = 10**9
while hq:
front = heapq.heappop(hq)
minVal = front[0]
index = front[1]
res = min(res, maxVal - minVal)
if ind[index] == M:
break
heapq.heappush(hq, (arr[index][ind[index]], index))
maxVal = max(maxVal, arr[index][ind[index]])
ind[index] += 1
print(res)
'Programming > Problem Solving' 카테고리의 다른 글
[Programmers] 정수 삼각형 (0) | 2021.07.29 |
---|---|
[BOJ] 17471 게리맨더링 - Python (0) | 2021.07.29 |
[Programmers] 모두 0으로 만들기 (0) | 2021.07.25 |
[Programmers] 110 옮기기 (0) | 2021.07.25 |
[BOJ] 20057 마법사 상어와 토네이도 - Python (0) | 2021.07.22 |