IT recording...
[BOJ] 2096 내려가기 - python 본문
https://www.acmicpc.net/problem/2096
풀이
|
import sys
def input():
return sys.stdin.readline().rstrip()
N = int(input())
firstLine = list(map(int,input().split(" ")))
ans_max,ans_min = firstLine, firstLine #첫 번째 줄 입력받기
for _ in range(N-1): #각 줄 돌리기
line = list(map(int,input().split(" ")))
tmp_max,tmp_min = [0,0,0],[0,0,0]
#==========한 줄에 대해서(한 단계) 0,1,2 각각 다 하기==========
tmp_max[0] = max(ans_max[0],ans_max[1]) + line[0] #이전 것에서 최대인 것 택하고 + 현재 자신의 위치 값 더하기
tmp_min[0] = min(ans_min[0],ans_min[1]) + line[0] # 최소
tmp_max[1] = max(ans_max[0], ans_max[1], ans_max[2]) + line[1]
tmp_min[1] = min(ans_min[0], ans_min[1], ans_min[2]) + line[1]
tmp_max[2] = max(ans_max[1], ans_max[2]) + line[2]
tmp_min[2] = min(ans_min[1], ans_min[2]) + line[2]
#========================================================
ans_max, ans_min = tmp_max, tmp_min #각 줄마다 ans 갱신
print(max(ans_max),min(ans_min))
얻어가는 것
- 메모리 부족
→ 모든 줄을 저장하려 하지 말고 한 줄 씩 해결할 수 있는 문제라면
→ 한 줄,한 줄을 입력받아가며 (덮어씌우면서) 문제를 푼다.
⇒ 메모리가 매우 작은데 100,000줄이면 한 줄 씩 입력 받아 풀 수 있는 문제인지 확인하기
# N <= 100,000일 때, 모든 것을 저장해버리면 메모리 4MB제한을 통과하지 못한다.
lines = [list(map(int, input().split(" "))) for _ in range(N)]
- 위에서 아래로 진행할 때 결과만 저장하면 되는 경우에는 루트가 아니라, 값만 저장하면 되므로 dp 테이블을 대폭 줄여서 사용가능하다.
느낀점
"211126"
소요 시간 : 3h이상
- 와 메모리초과 빡세넹,, 한 번에 저장하면 안되고 입력 받으면서 풀어야만 하는 경우는 처음 봤다.
- 또 위에서 아래로 진행한다고 해서 무조건 위→아래 방향으로 생각하지 말고, 아래를 오기 위해 위는 누구누구가 있지? 를 생각할 수 있다는 점을 깨달았다. \
- 후 진짜 너무 빡세다 어려워.. for문 헷갈려..dfs bfs dp 연습..필요..
'Algorithm' 카테고리의 다른 글
[BOJ] 1072 두 배열의 합 - python (0) | 2021.12.02 |
---|---|
[BOJ] 2143 두 배열의 합 - python (0) | 2021.12.02 |
[BOJ] 1806 부분합 - python (0) | 2021.12.02 |
[BOJ] 2470 두 용액 - python (0) | 2021.12.02 |
[BOJ] 2805 나무 자르기 - python (0) | 2021.12.02 |
Comments