# 문제
백준 1932 정수 삼각형 파이썬 풀이
# 코드
import sys
n = int(sys.stdin.readline().strip())
arr = list()
for _ in range(n) :
line = list(map(int,sys.stdin.readline().split()))
arr.append(line)
for row in range(1,n):
for col in range(len(arr[row])) :
if col == 0 : # 시작점이면
arr[row][col] += arr[row-1][col]
continue
if col == len(arr[row])-1 : # 끝점이면
arr[row][col] += arr[row-1][col-1]
continue
# 그 외 경우인 경우
arr[row][col] += max(arr[row-1][col], arr[row-1][col-1])
print(max(arr[n-1]))
# 풀이
- 먼저 문제에서 주어진 정수 삼각형의 틀가 실제 배열로 들어오는 정수 삼각형의 모양이 다르다는 것을 알고, 이 두개가 똑같이 맵핑시킬 수 있는지에 대한 관계를 찾았다.
- 생각보다 쉽게 바로 아래와 오른쪽 대각선 아래가 쉽게 매핑 됐다. 현재 보는 노드에서 바로 아래와 오른쪽 대각선을 보게 되는 규칙을 가진다.
- 문제 해결 전략은 현재 노드에서 살펴보는 위의 노드를 비교해보고 현재 자신의 값과 더했을때 최대가 되는 값으로 자신을 확정짓는 방법의 DP를 이용하면 된다.
- DP의 중요점은 현재 확정지어야하는 노드를 선택하는 방법이고 그 노드를 선택했을때 이후 선택에 영향을 주지 않는 근거가 있어야한다.
- 다음과 같이 위의 노드를 보게 되는 경우 col(열)이 0번인 경우의 맨끝인 경우는 양쪽을 보지 않고 바로 위 또는 대각선 위만을 보게 된다. 이걸 반복문에서 표현해야 했다.
if col == 0 : # 시작점이면
arr[row][col] += arr[row-1][col]
continue
if col == len(arr[row])-1 : # 끝점이면
arr[row][col] += arr[row-1][col-1]
continue
'•알고리즘(Algorithm ) > 문제풀이' 카테고리의 다른 글
[백준13549&파이썬] BFS에서 큐에 넣을때 때때로 순서도 중요하다. (1) | 2023.05.11 |
---|---|
[백준2638&파이썬] BFS에 구현과 시뮬레이션이 섞인 문제 (0) | 2023.05.11 |
[백준9465&파이썬] DP를 풀때는 N이 1일때부터 하나씩 늘려가며 경우의 수를 따져보자. (0) | 2023.05.09 |
[백준1149&파이썬] DP를 사용할때 확정되는 값에 대한 명확한 근거를 찾자 (1) | 2023.05.08 |
[백준1991&파이썬] 파이썬에서 이진트리의 전위,중위,후위 간단히 수행해보자. (0) | 2023.05.06 |