https://www.acmicpc.net/problem/18111
[알고리즘]
1) 완전 탐색 시간 복잡도
500 * 500 * 256 = 64,000,000 때문에 min, max를 정해서 사용했는데 생각해보니 하나의 land에 0과 256이 같이 들어있으면 min_land = 0, max_land = 256이 되어서 방지할 수 없다. 그래서 3중 for문으로 완전 탐색을 하게 되면 시간 초과다.
2) 이를 해결하기 위해 이차원리스트(land)에서 같은 높이를 가지는 블럭들을 하나의 list에 저장해준다. 그러면 같은 값이 있는 블럭은 중복으로 확인할 필요가 없기 때문에, 3중 for문 없이 모든 블럭의 높이를 같게 해주는 계산을 수행할 수 있다.
[시초코드]
from sys import stdin
input = stdin.readline
n,m,b = map(int, input().split())
land = [list(map(int, input().split())) for _ in range(n)]
min_land = min(map(min, land))
max_land = max(map(max, land))
ans = 1e9
for x in range(min_land, max_land+1) :
# 인벤토리에서 가져와야 할 최소/최댓값
min_num, max_num = 0, 0
for i in range(n) :
for j in range(m) :
if land[i][j] < x :
min_num += (x-land[i][j])
else:
max_num += (land[i][j]-x)
# 남아있는 inventory
# max_num은 블록을 가지런히 하고도 남으니까 inven에 채워주기
inventory = b + max_num
if inventory < min_num : continue
t = 2 * max_num + min_num
# 최소 시간, 가장 높은 높이
# 어차피 오름차순 탐색이기 때문에, tall은 신경쓸 필요 x
if t <= ans :
ans = t
tall = x
print(ans, tall)
[정답 코드]
[알게된 점]
- int 범위 내에서 무한(INF)값 이용하기
- 1e9 = 1*10**9 = 1,000,000,000,
- 2e9 = 2*10**9 = 2,000,000,000
- 이중리스트에서 원소의 최소/최댓값 구하는 방법
- min(map(min, list))
- max(map(max, list))
- 파이썬의 시간 복잡도 : 5초에 1억
Reference
https://land-turtler.tistory.com/82
https://thflgg133.tistory.com/88
'PS > BOJ&Programmers' 카테고리의 다른 글
[백준/13699] 점화식 | 동적계획법 dp 개념(피보나치)| 이중포문의 활용 | (0) | 2023.03.19 |
---|---|
[백준/17202] 핸드폰 번호 궁합 | 배열을 통해서 연산 갱신하기 |011223.. 인덱싱 (0) | 2023.03.19 |
[백준/16283] Farm (2) | 2023.03.10 |
[백준/2961] 도영이가 만든 음식 | 브루트포스의 구조(조합) | 곱셈 누적 초기화는 1 | 디버깅을 열심히 하자. 내가 짠 코드를 파악하는 방법 (0) | 2023.03.05 |
[백준/1260] DFS와 BFS | 인접 리스트에 그래프 저장하기 (0) | 2023.03.01 |