sm 기술 블로그
131. 1932(정수 삼각형) 본문
import java.util.*;
import java.io.*;
class Main {
public static void main(String[] args) throws IOException {
BufferedReader br = new BufferedReader(new InputStreamReader(System.in));
int N = Integer.parseInt(br.readLine());
ArrayList<Integer>[] triangle = new ArrayList[N];
for (int i = 0; i < N; i++) {
triangle[i] = new ArrayList<Integer>();
}
for (int i = 0; i < N; i++) {
String[] tmp = br.readLine().split(" ");
for (int j = 0; j < tmp.length; j++) {
triangle[i].add(Integer.parseInt(tmp[j]));
}
}
for (int i = 1; i < N; i++) {
for (int j = 0; j < i + 1; j++) {
if (i == 1) {
triangle[i].set(j, triangle[i].get(j) + triangle[0].get(0));
continue;
}
if (j == 0) {
triangle[i].set(j, triangle[i].get(j) + triangle[i-1].get(0));
continue;
}
if (j == i) {
triangle[i].set(j, triangle[i].get(j) + triangle[i-1].get(j-1));
continue;
}
triangle[i].set(j, triangle[i].get(j) + Math.max(triangle[i-1].get(j-1), triangle[i-1].get(j)));
}
}
System.out.println(Collections.max(triangle[N-1]));
}
}
문제요약
N층 까지 있는 정수 삼각형에 값을 주는데 아래층으로 내려올 때 선택된 수의 합이 최대인 경우를 구하라.
설명
다음과 같이 차례로 누적합을 구해 나가면서 최종에 도달 했을 때 최대 값을 고르면 된다.
if (i == 1) {
triangle[i].set(j, triangle[i].get(j) + triangle[0].get(0));
continue;
}
두번째 케이스 부터 시작하는데 맨 처음( 3과 8이 나오는 부분)에는 전에 값이 하나밖에 없으므로 그 값을 바로 더한다.
if (j == 0) {
triangle[i].set(j, triangle[i].get(j) + triangle[i-1].get(0));
continue;
}
현재 테스트 케이스의 인덱스가 0인 값은 무조건 전 케이스의 인덱스가 0인 값을 더해야 한다.
if (j == i) {
triangle[i].set(j, triangle[i].get(j) + triangle[i-1].get(j-1));
continue;
}
현재 테스트 케이스의 인덱스가 마지막인 값은 무조건 전 케이스의 인덱스의 마지막 값을 더해야 한다.
triangle[i].set(j, triangle[i].get(j) + Math.max(triangle[i-1].get(j-1), triangle[i-1].get(j)));
위에 모두 해당 되지 않는 경우 전 케이스 두 값 중 최대값을 찾아서 그 값을 더하고 덮어 씌우면 된다.
'문제 > 백준_자바' 카테고리의 다른 글
133. 1463(1로 만들기) (0) | 2022.07.05 |
---|---|
132. 2579(계단 오르기) (0) | 2022.07.04 |
130. 1149(RGB 거리) (0) | 2022.07.03 |
129. 1912(연속합) (0) | 2022.07.03 |
128. 9461 (파도반 수열) (0) | 2022.07.03 |
Comments