오답노트

[브루트포스] BOJ 18111 마인크래프트 본문

Python/코딩테스트

[브루트포스] BOJ 18111 마인크래프트

권멋져 2023. 5. 4. 18:25

문제

https://www.acmicpc.net/problem/18111

 

18111번: 마인크래프트

팀 레드시프트는 대회 준비를 하다가 지루해져서 샌드박스 게임인 ‘마인크래프트’를 켰다. 마인크래프트는 1 × 1 × 1(세로, 가로, 높이) 크기의 블록들로 이루어진 3차원 세계에서 자유롭게

www.acmicpc.net

풀이

0층부터 256층까지 모두 둘러보면서

만들 수 있는 최소시간에 만들 수 있는 최고층을 찾으면 된다.

 

이때 블럭을 제거하면 다시 그 블럭을 사용할 수 있는데, 이 조건을 충족시키는 층끼리만 비교하면 된다.

 

import sys

N, M, B = map(int,sys.stdin.readline().split())

map_list = []
ans = 1e9
idx = 0

for _ in range(N):
    map_list.append(list(map(int,sys.stdin.readline().split())))


for target in range(257): # 목표 지반
    max_target, min_target = 0, 0

    for i in range(N):
        for j in range(M):

            # 블록이 층수보다 더 크면
            if map_list[i][j] >= target:
                max_target += map_list[i][j] - target # 블럭제거

            # 블록이 층수보다 더 작으면
            else:
                min_target += target - map_list[i][j] # 블럭추가

    if max_target + B >= min_target: # 제거한 블럭 + 가지고있던 블럭으로 다른 위치에 블럭을 추가할 수 있으면
        # 시간 초를 구하고 최저 시간과 비교 
        if min_target + (max_target * 2) <= ans:
        	# 0부터 256층까지 비교하므로 업데이트 될수록 고층의 최저시간
            ans = min_target + (max_target * 2) # 최저 시간
            idx = target # 층수

print(ans, idx)

'Python > 코딩테스트' 카테고리의 다른 글

[브루트포스] BOJ 1107 리모컨  (0) 2023.05.04
[DP] BOJ 10942 팰린드롬?  (1) 2023.04.13
[DP] BOJ 12865 평범한 배낭  (0) 2023.04.05
[DP] BOJ 9251 LCS  (4) 2023.04.05
[Heap] 프로그래머스 - 디스크 컨트롤러  (0) 2023.04.02