반응형
동적프로그래밍(Dynamic Programming)의 기본형이 되는 문제이다.
Math.max값을 이용하여 이전 인덱스의 값과 비교하여 주어진 배열에 직접 업데이트 하는 방식이다.
import java.util.Arrays;
class Solution {
public int solution(int[][] triangle) {
int answer = 0;
for (int height = 1; height < triangle.length; height++) {
for (int i = 0; i < triangle[height].length; i++) {
if (i == 0) {//맨왼쪽
triangle[height][0] += triangle[height - 1][0];
} else if (i == triangle[height].length - 1) {//맨오른쪽
triangle[height][i] += triangle[height - 1][i - 1];//
} else {
triangle[height][i] +=
Math.max(triangle[height - 1][i - 1], triangle[height - 1][i]);
}
}
}
int[] max_sum = triangle[triangle.length - 1];
Arrays.sort(max_sum);
answer = max_sum[max_sum.length - 1];
return answer;
}
}
1) 양쪽 끝의 인덱스에서는 그대로 값을 더해주고,
2) 나머지 사이에 있는 값들은 이전 높이(height-1)에서 i항과 i-1항의 값을 비교하여 큰 값을 더해준다.
그리고 가장 마지막 줄에 있는 triangle의 밑변 값들을 가져와서 오름차순으로 정렬.
이후 마지막 항에 있는 값이 최대값이므로 return해준다.
아래는 간결하게 만든 코드이다.
import java.util.*;
class Solution {
public int solution(int[][] triangle) {
for (int i = 1; i < triangle.length; i++) {
triangle[i][0] += triangle[i-1][0];
triangle[i][i] += triangle[i-1][i-1];
for (int j = 1; j < i; j++)
triangle[i][j] += Math.max(triangle[i-1][j-1], triangle[i-1][j]);
}
return Arrays.stream(triangle[triangle.length-1]).max().getAsInt();
}
}
이처럼 for문에서 if문을 사용하지않고 미리 양쪽 끝값을 사전에 처리하여 if문을 안쓰는 방식이 있다.
코드 상 보기에는 간결하나, 실제 실행속도에는 별 차이가 없다.
그리고, stream을 이용한 배열의 최댓값을 구하는 방식을 참고하면 좋겠다.(물론 스트림은 비추다.)
Arrays.stream(triangle[triangle.length-1]).max().getAsInt();
반응형
'코딩테스트 > Java' 카테고리의 다른 글
[JAVA] 동적프로그래밍(DP) "도둑질" (0) | 2020.10.22 |
---|---|
[JAVA] 동적프로그래밍(DP) "등굣길" (0) | 2020.10.21 |
[JAVA] 동적프로그래밍(DP) "N으로 표현하기" (0) | 2020.10.19 |
[JAVA] 탐욕법(Greedy) "단속카메라" (0) | 2020.10.08 |
[JAVA] 탐욕법(Greedy) "섬 연결하기" (0) | 2020.10.07 |