티스토리 뷰
1. 풀이 과정
- 각 층의 숫자마다 윗 층부터 조건에 맞게 내려온 숫자들의 최대합을 구하여 저장한뒤 각 합 중에서 최대 값을 판별한다.
* 풀이 과정 예시
1) 각 층의 양 끝 숫자의 합은 윗 층 부터 대각선으로 한 방향으로 내려온 숫자들의 합이 최대 합이된다.
2) 각 층의 양 끝값 사이의 수들은 윗 층으로 부터 내려온 숫자중에서 현재 층의 숫자의 앞으로 한칸 뒤로 한칸 값의 합이 된다.
3) 또한 양 끝값 사이의 수가 둘 이상일 경우 다음 층으로 내려가기 전에 각 숫자들의 합중에 최대 값을 구한 뒤 다음 층을 계산한다.
4) 위와 같이 각 층의 숫자들의 최대합을 구하면서 마지막 층으로 내려가면 최종적으로 왼쪽 끝값, 오른쪽 끝값, 가운데 값이 남게 된다.
5) 마지막으로 남은 세 값의 최대값이 정답이다.
2. 코드 구현
- 삼각형에 들어갈 값을 입력한 그 자리에 바로 계산한 최대합을 저장한다.
- 각 삼각형의 위치에 바로 최대합을 저장해서, 계산할 때 입력받은 삼각형의 값이 아닌 최대합끼리 계산할 수 있도록 코드를 구현한다.
- 최대합의 저장은 현재 삼각형에 있는 수 + 이전 위치에서 최대값.
import java.util.Scanner;
public class IntegerTriangle {
public static void main(String[] args) {
Scanner sc = new Scanner(System.in);
int max = 0, n = sc.nextInt();
int[][] dp = new int[501][501];
for (int i = 1; i <= n; i++) {
for (int j = 1; j <= i; j++) {
dp[i][j] = sc.nextInt(); // 각 층에 숫자 입력
// 숫자 입력과 동시에 최대값 판별
if (j == 1) {
dp[i][j] += dp[i - 1][j]; //양 끝값은 그대로 내려온 값이 최대합
} else if (j == i) {
dp[i][j] += dp[i - 1][j - 1];
} else {
dp[i][j] += Math.max(dp[i - 1][j - 1], dp[i - 1][j]); // 중간에 있는 수 최대합 판별
}
// 최대값 저장
max = Math.max(max, dp[i][j]);
}
}
System.out.println(max);
sc.close();
}
}
* Buffer로 입력받아서 구현해보기
'Algorithm > 백준' 카테고리의 다른 글
Backjoon(백준) 1463번 - 1로 만들기(Java) (0) | 2020.04.28 |
---|---|
Backjoon(백준) 2579번 - 계단 오르기(Java) (0) | 2020.04.27 |
Backjoon(백준) 1149번 - RGB거리(Java) (0) | 2020.04.25 |
Backjoon(백준) 9641번 - 파도반 수열(Java) (0) | 2020.04.24 |
Backjoon(백준) 1904번 - 01타일(Java) (0) | 2020.04.23 |
최근에 올라온 글
최근에 달린 댓글
TAG
- 백준
- 20200804
- 20200317
- 20200406
- 20200504
- 20200510
- 20200429
- 20200421
- 20200503
- 20200330
- chapter7
- 20200622
- 20200624
- 20200403
- 20200417
- 20200413
- 20200319
- 20200425
- 20200502
- 20200415
- 20200427
- 20200428
- 20200420
- 생활코딩리눅스
- 20200512
- 20200424
- likelion
- 20201204
- chapter8
- 20200423
- Total
- Today
- Yesterday