CodingTest/Baekjoon

[baekjoon] 백준 18111번(파이썬): 마인크래프트

JunJangE 2022. 5. 2. 00:53

문제

 

18111번: 마인크래프트

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

www.acmicpc.net

알고리즘

- 0층부터 256층까지 반복하여 블록을 확인한다.

- 블록이 층수보다 더 크면 그때의 개수를 더하고 블록의 층수보다 더 작으면 그때의 개수를 더한다.

- 블록을 뺀 것과 원래 있던 블록의 합과 블록을 더한 값을 비교한다.

- 블록을 뺀 것과 원래 있던 블록의 합이 더 커야 층을 만들 수 있다.

- 층을 만들 수 있다면 그때의 시간초를 구하고 최저 시간과 비교한다.

-  0부터 256층까지 비교하므로 업데이트될수록 고층의 최저 시간이 된다.

코드

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):
    max_target, min_target = 0, 0

    # 반복문을 통해 블록을 확인
    for i in range(n):
        for j in range(m):

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

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

    # 블록을 뺀 것과 원래 있던 블록의 합과 블록을 더한 값을 비교
    # 블록을 뺀 것과 원래 있던 블록의 합이 더 커야 층을 만들 수 있음.
    if max_target + b >= min_target:
        # 시간 초를 구하고 최저 시간과 비교 
        if min_target + (max_target * 2) <= answer:
        	# 0부터 256층까지 비교하므로 업데이트 될수록 고층의 최저시간
            answer = min_target + (max_target * 2) # 최저 시간
            idx = target # 층수

print(answer, idx)

github

 

GitHub - junjange/CodingTest: 내가 푼 코딩 테스트 문제와 해결법

내가 푼 코딩 테스트 문제와 해결법. Contribute to junjange/CodingTest development by creating an account on GitHub.

github.com