완성 코드. 브루트포스. 생각보다 아직 어려워서 다른 코드들을 참고했다.

문제 이해도 너무 오래 걸리고, 푸는 데도 너무 오래 걸려서 속상하다.

그래도 점점 늘겠지? 다양한 인사이트들을 얻었고, 가장 많이 참고한 정답 코드 블로거보다 내가 더 짧고 가독성 좋게 입력한 부분도 있었다.

그리고 브루트포스라는 힌트만 얻고나서, 그래도 나름 맞게 코드를 작성했었다. 오류들이 많아서 그렇지...

 

문제 꼼꼼하게 읽자..!

import sys
def input()->str:
    return sys.stdin.readline().rstrip()

n, m, b = map(int, input().split()) #세로 n, 가로 m, 인벤토리에 99개의 블록
heights=[list(map(int, input().split())) for _ in range(n)]

#블록을 추가하거나, 빼는 방법 2가지 경우 스킬 존재
#약간 체스판 자르기랑 비슷한 문제인 것 같다.

# 브루트포스로 모든 경우의 수를 구하고, 가장 시간이 적게 걸린 것 중,
# 땅의 높이가 높은 것 출력.

# 절대값 구하는 함수 abs()

ans = int(1e9) #답을 무한으로 걸어놓고, 조건을 만족시키면 바꿔준다.
glevel=-1
for h in range(0, 257):
    take_block=0
    use_block=0
    for i in range(n): #세로(row)
        for j in range(m):#가로(column)
            if heights[i][j]>=h: #추가
                take_block+=heights[i][j]-h
            else: #heights[i][j] <h:
                use_block+=h-heights[i][j]
    if use_block > take_block + b:
        pass
    else:
        t_sum=take_block*2+use_block

        if t_sum <= ans:
            ans = t_sum
            glevel=h #어차피 점점 높이가 높은 것으로 갱신 되니까
print(ans,glevel )

아래는 문제를 풀면서 얻은 내용들이다.

 

[.index() 특징]

.index()는 중복값이 있을 경우, 가장 큰 값을 리턴한다.

 

[높이 구하는 방법]

일단 초기값을 glevel = -1로 지정해 놓은 뒤, 어차피 높이가 올라가면서 가장 높은 것으로 자동으로 갱신되도록 했다.

 

[최댓값, 최솟값 리스트 쓰지 않고 계산하기]

매번 계산한 다음, 계산한 값들 중 최대값을 구할 때는 항상 list에다가 넣은 후, max(list)를 하는 방식으로 계산했었는데,

그게 아니라 초기값을 0으로 잡아둔 뒤(최소값 구할 때는 int(1e9)로 잡기) 하나의 값을 지정하고, 이 값보다 작을 경우 업데이트 하는 방식으로 가능.

 

드디어 Class 2 문제 다풀었다. 야호 !

+ Recent posts