18111_마인크래프트

minjun kim·2024년 5월 4일

Check Point !
( 해당사항 ✓체크 )

막힘 없이 수월하게 풀린 문제인가?

1시간이내로 풀렸던 문제인가?

1시간 이상 or 며칠을 두고 풀어봤더니 풀린 문제인가?

시간을 써도 도무지 풀 수 없는 문제인가? ✅ (외웠다.)

솔루션을 찾아봤는가? ✅

난이도 체감

최상

중 ✅ (실2)

<이해도>

완벽히 이해

다소 헷갈리는 부분들이 있음

이해 못함 ✅

<덧붙일 말>
브루트 포스로 해결하는데 이해를 못했다. 나중에 해당 알고리즘을 이해하고 다시 풀어보자.

문제

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

풀이

import sys

input = sys.stdin.readline
n,m,b = map(int,input().split())
board =  [list(map(int, input().split())) for _ in range(n)]

INF = int(1e9)
def check(board,lv,b):
    sc = 0
    c = 0
  
    for i in range(n):
        for j in range(m):
            z = board[i][j] - lv
            if z > 0: # 블록 채움
                b += z
                sc += 2 * z
                
            else: # 블록 파기
                c += -z
    if b < c:
        return INF
    return sc + c
 
msc = INF
mlv = 0   

for lv in range(256, -1,-1):
    sc = check(board, lv, b)
    if msc > sc:
        msc = sc
        mlv = lv
print(msc, mlv)

막상 문제를 그냥 풀이법을 보고 외워버렸는데 조금만 응용하더라도 다른 문제를 해결하지 못할 것이다.

이해못한점은 c변수 사용을해서 sc와 c를 구분한 이유
풀이 전개방식이 아직 정확히 이해가안간다.

profile
배움의 흔적을 남기고 싶습니다.

0개의 댓글