[문제 링크]
https://www.acmicpc.net/problem/1932
[난이도]
- Silver 1
[알고리즘]
- DP
[코드]
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));
int n = Integer.parseInt(br.readLine());
int[][] triangle = new int[n][]; // 2차원은 가변적으로 선언
int[][] dp = new int[n][]; // 2차원은 가변적으로 선언
for (int i = 0; i < n; i++) {
StringTokenizer st = new StringTokenizer(br.readLine());
triangle[i] = new int[i + 1];
dp[i] = new int[i + 1];
for (int j = 0; j <= i; j++) {
triangle[i][j] = Integer.parseInt(st.nextToken());
}
}
// 초기값 설정
dp[0][0] = triangle[0][0];
// dp 배열 채우기
for (int i = 1; i < n; i++) {
for (int j = 0; j <= i; j++) {
if (j == 0) { //
dp[i][j] = dp[i - 1][j] + triangle[i][j];
} else if (j == i) {
dp[i][j] = dp[i - 1][j - 1] + triangle[i][j];
} else {
dp[i][j] = Math.max(dp[i - 1][j - 1], dp[i - 1][j]) + triangle[i][j];
}
}
}
// dp배열의 마지막 열중 최대값 출력
int maxSum = 0;
for (int j = 0; j < n; j++) {
maxSum = Math.max(maxSum, dp[n - 1][j]);
}
System.out.println(maxSum);
}
}
[풀이]
dp 2차원 배열은 정사각형일 필요가 없으므로 입력받을 때 마다 2차원배열의 2차원의 크기를 i+1 로 초기화 해준다.
int[][] triangle = new int[n][]; // 2차원은 가변적으로 선언
int[][] dp = new int[n][]; // 2차원은 가변적으로 선언
for (int i = 0; i < n; i++) {
StringTokenizer st = new StringTokenizer(br.readLine());
triangle[i] = new int[i + 1];
dp[i] = new int[i + 1];
for (int j = 0; j <= i; j++) {
triangle[i][j] = Integer.parseInt(st.nextToken());
}
}
dp배열의 점화식은 아래와 같다.
dp[i][j] = Math.max(dp[i - 1][j - 1], dp[i - 1][j]) + triangle[i][j];
dp[i][j] 는 dp[i-1][j-1]와 dp[i-1][j] 두 수를 비교해 둘중 큰 값을 선택한다. 하지만 여기서 문제가있다.
삼각형중 가장 왼쪽의 수와 가장 오른쪽의 수는 두 수를 비교할 수가 없다.
가장 왼쪽의 수는 비교할 수가 하나밖에없어 무조건 dp[i-1][j]를 선택해야만 한다. 그래서 따로 조건문을 만들어준다.
if (j == 0) { //
dp[i][j] = dp[i - 1][j] + triangle[i][j];
}
삼각형의 가장 오른쪽의 수도 비교할 수가 하나밖에 없기때문에 무조건 dp[i-1][j-1]를 선택해야만 한다.
else if (j == i) {
dp[i][j] = dp[i - 1][j - 1] + triangle[i][j];
}
'코딩테스트' 카테고리의 다른 글
백준 18352 : 특정 거리의 도시 찾기 [JAVA] (1) | 2024.06.13 |
---|---|
백준 11725 : 트리의 부모 찾기 [JAVA] (1) | 2024.06.13 |
백준 11055 : 가장 큰 증가하는 부분 수열2 [JAVA] (0) | 2024.06.12 |
백준 9184 : 신나는 함수 실행[JAVA] (0) | 2024.06.12 |
백준 1965 : 상자넣기 [JAVA] (1) | 2024.06.11 |