반응형
백준 1932번 문제 - 정수 삼각형
1932번: 정수 삼각형
첫째 줄에 삼각형의 크기 n(1 ≤ n ≤ 500)이 주어지고, 둘째 줄부터 n+1번째 줄까지 정수 삼각형이 주어진다.
www.acmicpc.net
문제 분석
- 삼각형을 이루게 숫자가 주어진다.
- 아래층에 있는 수: 현재 층에서 선택된 수의 대각선 왼쪽, 대각선 오른쪽에 있는 것 중에서만 선택
- 이때 첫번째 층 부터 마지막 층까지 거쳐간 수를 모두 더했을 때, 가장 큰 수를 출력해라.
해결 포인트
- DP 이용
- 각 층마다 숫자 등록
- i층에 j번째 수(nums[i][j])의 왼쪽 대각선은 i+1층에 j번째 수(nums[i+1][j]),
오른쪽 대각선은 i+1층에 j+1번째 수(nums[i+1][j+1])로 한다.
- i층에 j번째 수(nums[i][j])의 왼쪽 대각선은 i+1층에 j번째 수(nums[i+1][j]),
- 1층인 하나의 수는 값 넣어놓기
- 다음 층부터는 dp로 가장 큰 값 구하기
- nums[i][j]가 갈 수 있는 다음 값
1. nums[i+1][j]
2. nums[i+1][j+1] - 이 곳의 저장된 합과 현재 층에서 넘어갔을 때 합 중 큰 값을 저장
- nums[i][j]가 갈 수 있는 다음 값
코드
import java.io.*;
import java.util.*;
public class Main {
public static void main(String[] args) throws IOException {
BufferedReader br = new BufferedReader(new InputStreamReader(System.in));
BufferedWriter bw = new BufferedWriter(new OutputStreamWriter(System.out));
int N = Integer.parseInt(br.readLine());
int [][] nums = new int[N][N];
for (int i = 0; i < N; i++) {
StringTokenizer st = new StringTokenizer(br.readLine());
for (int j = 0; j < i+1; j++) {
nums[i][j] = Integer.parseInt(st.nextToken());
}
}
int [][] sums = new int[N][N];
sums[0][0] = nums[0][0];
for (int i = 0; i < N-1; i++) {
for (int j = 0; j < i+1; j++) {
sums[i+1][j] = Math.max(sums[i][j] + nums[i+1][j], sums[i+1][j]);
sums[i+1][j+1] = Math.max(sums[i][j] + nums[i+1][j+1], sums[i+1][j+1]);
}
}
int result = 0;
for (int i = 0; i < N; i++) {
result = Math.max(result, sums[N-1][i]);
}
bw.write(result + "\n");
bw.flush();
bw.close();
}
}
반응형
'CodingTEST' 카테고리의 다른 글
[프로그래머스] 의상 (JAVA) (0) | 2024.01.20 |
---|---|
[백준 1991] 트리 순회(JAVA) (0) | 2024.01.16 |
[백준 1629] 곱셈 (JAVA) (0) | 2024.01.15 |
[백준 1149] RGB거리 (JAVA) (0) | 2024.01.14 |
[백준 16953] A → B (JAVA) (0) | 2024.01.14 |