티스토리 뷰
정수 삼각형 성공
1932번: 정수 삼각형
첫째 줄에 삼각형의 크기 n(1 ≤ n ≤ 500)이 주어지고, 둘째 줄부터 n+1번째 줄까지 정수 삼각형이 주어진다.
www.acmicpc.net
문제
7
3 8
8 1 0
2 7 4 4
4 5 2 6 5
위 그림은 크기가 5인 정수 삼각형의 한 모습이다.
맨 위층 7부터 시작해서 아래에 있는 수 중 하나를 선택하여 아래층으로 내려올 때, 이제까지 선택된 수의 합이 최대가 되는 경로를 구하는 프로그램을 작성하라. 아래층에 있는 수는 현재 층에서 선택된 수의 대각선 왼쪽 또는 대각선 오른쪽에 있는 것 중에서만 선택할 수 있다.
삼각형의 크기는 1 이상 500 이하이다. 삼각형을 이루고 있는 각 수는 모두 정수이며, 범위는 0 이상 9999 이하이다.
입력
첫째 줄에 삼각형의 크기 n(1 ≤ n ≤ 500)이 주어지고, 둘째 줄부터 n+1번째 줄까지 정수 삼각형이 주어진다.
출력
첫째 줄에 합이 최대가 되는 경로에 있는 수의 합을 출력한다.
내 코드
import sys
n=int(sys.stdin.readline())
arr=[] #원본 삼각형을 저장했다가, 각 합을 누적하는 것으로 쓸 것임.
for _ in range(n): #각 줄을 리스트 형태로 arr에 저장.
tmp_arr=list(map(int, sys.stdin.readline().split()))
arr.append(tmp_arr)
for i in range(1,n): #제일 위에 줄은 패스하고 다음줄부터.
for j in range(i+1): #i번째줄은 i+1개만큼 요소를 가진다.
if j==0: #왼쪽 끝에 놈은 그냥 내 위에서 오른쪽놈 더하면 됨.
arr[i][j]=arr[i-1][j]+arr[i][j]
elif j==i: #오른쪽 끝에 놈은 그냥 내 위에서 왼쪽놈 더하면 됨.
arr[i][j]=arr[i-1][j-1]+arr[i][j]
else: #그 외에는 위에서 왼쪽놈과 오른쪽놈 중 큰놈을 선택해서 더해야 한다.
arr[i][j]=arr[i][j]+max(arr[i-1][j-1],arr[i-1][j])
#제일 마지막 줄에 최종 합들이 누적되어 있는데, 그 중 최대값이 답이다.
answer=max(arr[n-1])
print(answer)
풀이 및 접근)
- 최대값이기 때문에 줄마다 합을 다 구하면서 최종 줄에서 가장 큰 놈으로 답을 정해야 한다. 별다른 short cut이 없기 때문에 일일이 다 더해가면서 누적해야 한다. 하지만 누적하는 과정에서 약간의 경우의 수를 나눌 수 있는데, 특정 요소가 왼쪽 끝이나 오른쪽 끝에 있다면 그저 대각선 위의 놈(양끝일 경우 하나밖에 없다)을 더하면 되지만, 그 외의 경우는 왼쪽위 대각선, 오른쪽위 대각선 두가지이다. 이 때, 둘 중 큰놈을 선택하면서 더해 가면, 최종 줄에서 최대값들의 후보군을 형성할 수 있다. 그 후보군들 중에서 최대값을 고르면 그것이 답이다.
'백준' 카테고리의 다른 글
백준 1912: 연속합 - 파이썬 (0) | 2023.10.12 |
---|---|
백준 1149: RGB거리 - 파이썬 (0) | 2023.10.12 |
백준 9935: 문자열 폭발 - 파이썬 (0) | 2023.09.21 |
백준 1003: 피보나치 함수 - 파이썬 (0) | 2023.09.21 |
백준 9095: 1, 2 3 더하기 - 파이썬 (0) | 2023.09.19 |