완성 코드. 브루트포스. 생각보다 아직 어려워서 다른 코드들을 참고했다.
문제 이해도 너무 오래 걸리고, 푸는 데도 너무 오래 걸려서 속상하다.
그래도 점점 늘겠지? 다양한 인사이트들을 얻었고, 가장 많이 참고한 정답 코드 블로거보다 내가 더 짧고 가독성 좋게 입력한 부분도 있었다.
그리고 브루트포스라는 힌트만 얻고나서, 그래도 나름 맞게 코드를 작성했었다. 오류들이 많아서 그렇지...
문제 꼼꼼하게 읽자..!
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 문제 다풀었다. 야호 !
'코딩테스트 준비 > Python' 카테고리의 다른 글
2004 python 조합 0의 개수 (2) | 2024.07.14 |
---|---|
1764 듣보잡 python (0) | 2023.09.22 |
백준 1654 랜선 자르기 코드 및 설명 (0) | 2023.09.01 |
백준 15829 python Hashing 문제 풀이 (0) | 2023.08.29 |
백준 4949 균형 잡힌 세상 | 여러가지 풀이법 (0) | 2023.08.29 |