- 문제(link)
브루트포스 알고리즘으로 해결하는 문제입니다. 땅의 높이는 256블록을 초과할 수 없습니다. 층을 기준으로해서모든 경우의 수를 계산합니다. 층(target)과 같은 높이만큼 블록을 제거하거나 추가해서 (작업 최소 시간, 높이)를 구할 수 있습니다.
풀이 방법
[1] 0~256층까지 반복 [1-1] graph 좌표에 저장되어 있는 블록이 층 수보다 크거나 같으면 → 블록 제거, 인벤토리에 추가 [1-2] graph 좌표에 저장되어 있는 블록이 층 수보다 작으면 → 블록 추가, 인벤토리에서 제거 [1-3] 인벤토리 블록의 범위 안에서 작업했다면 [1-3-1] 최소 시간이라면 Update (작업 최소시간, 높이)
Code (python)
import sys
n, m, b = map(int, sys.stdin.readline().split())
graph = [list(map(int, sys.stdin.readline().split())) for _ in range(n)]
answer = sys.maxsize
idx = 0
# 0층부터 256층까지 반복
for target in range(257):
plus, minus = 0, 0
for i in range(n):
for j in range(m):
# 블록이 층 수보다 크거나 같으면 -> 인벤토리에 추가
if graph[i][j] >= target:
plus += graph[i][j] - target
# 블록이 층 수보다 작으면 -> 인벤토리에서 제거
else:
minus += target - graph[i][j]
#인벤토리 블록 수 이상으로 제거하지 않았다면
if plus + b >= minus:
# 최저 시간이면
if minus + (plus * 2) <= answer:
answer = minus + (plus * 2)
idx = target
print(answer, idx)