728x90
pypy3로 제출해야 합니다.
import sys
n, m, b = map(int, sys.stdin.readline().split())
graph = [ list(map(int, sys.stdin.readline().split())) for _ in range(n) ]
min_value = min(map(min, graph)) #1
max_value = max(map(max, graph)) #2
leastTime = float('Inf') #3
for i in range(min_value, max_value+1): #4
plus_container = 0 #5
minus_container = 0 #6
for j in range(n):
for k in range(m):
h = graph[j][k] - i #7
if h > 0:
minus_container += h #8
else:
plus_container -= h #9
if minus_container + b >= plus_container: #10
time = minus_container * 2 + plus_container
if leastTime >= time:
leastTime = time
resultHeight = i
print(leastTime, resultHeight)
인벤토리에 들어갈 블록의 수와 원래 인벤토이에 있던 블록 수의 합이 추가로 채워줘야 하는 블록 수 보다 크거나 같으면 땅 고르기를 할 수 있다. => 블록 수가 부족하면 더 채워줄 수 없으니까 만일 부족하면 빼주기만 해야한다.
#1, 2 : 2차원 배열 graph의 최소값과 최대값을 구하는 코드
#3 : 무한대를 의미
#4 : 최소 높이와 최대 높이 사이의 범위만 탐색
#5 : 인벤토리에서 추가해줄 블록 수 (현재높이에서 추가할 블록 수)
#6 : 인벤토리로 들어갈 블록 수 (현재높이에서 제거할 블록 수)
#7 : 최소 높이(i)를 기준으로 자르면 양수가 되고 최대 높이(i)를 기준으로 자르면 음수가 될 수 있다.
#8 : h가 양수라면 인벤토리에 들어갈 블록 수가 있는거니까 현재 높이에서 제거할 블록 수의 숫자를 추가
#9 : h가 음수라면 현재 높이에서 추가해 줘야할 블록 수가 있다는 의미니까 추가해 줘야할 블록 수 -= h를 해준다.
#10 : 현재 높이에서 빼줄 블록 수와 인벤토리에 있는 블록 수의 합이 현재 높이에서 채워줘야 할 블록 수보다 많아야 한다. (블록 수의 여유가 있어야 채워 줄 수 있으니까)
문제가 이해가 힘들었습니다. 불필요한 설명은 빼던가 추가 설명이 필요한 것 같습니다. 어려워서 블로그들을 찾아보고 그래도 이해가 안되서 꽤 오랫동안 고민했던 문제였습니다.
728x90
'[Coding Test] > [백준]' 카테고리의 다른 글
[백준] 10815 파이썬(python) : 숫자 카드 (0) | 2022.07.06 |
---|---|
[백준] 18870 파이썬(python) : 좌표 압축 - (★) (0) | 2022.07.06 |
[백준] 15829 파이썬(python) : Hashing (0) | 2022.07.06 |
[백준] 11651 파이썬(python) : 좌표 정렬하기 2 (0) | 2022.07.05 |
[백준] 2750 파이썬(python) : 수 정렬하기 (0) | 2022.07.05 |