Algorithms/- 프로그래머스
프로그래머스 - 정수 삼각형 [자바]
자굿
2022. 3. 6. 12:46
- 문제 링크 : 정수 삼각형
코딩테스트 연습 - 정수 삼각형
[[7], [3, 8], [8, 1, 0], [2, 7, 4, 4], [4, 5, 2, 6, 5]] 30
programmers.co.kr
정답(Solution)
class Solution {
public int solution(int[][] triangle) {
int answer = 0;
int temp = -1;
int[][] t = triangle;
for(int i=0; i<t.length - 1; i++){
for(int j=0; j<t[i].length; j++){
if(temp != -1){
t[i+1][j] = t[i+1][j] > temp + t[i][j] ?
t[i+1][j] : temp + t[i][j];
}else{
t[i+1][j] = t[i+1][j] + t[i][j];
}
temp = t[i+1][j+1];
t[i+1][j+1] = t[i+1][j+1] + t[i][j];
}
temp = -1;
}
int len = t.length;
for(int i=0; i<t[len-1].length; i++){
answer = Math.max(answer, t[len-1][i]);
}
return answer;
}
}
분석
이중 for문을 돌면서 i번째의 t[i][j] 를 i+1 번째의 t[i+1][j], t[i+1][j+1]에 더해준다.
예를 들어
j = 0 일때의 t[i+1][j+1] 와 j = 1일 때의 t[i+1][j] 가 동일한 변수이므로 그대로 더해줄 경우 2번 더하게 된다.
그래서 temp 변수를 -1로 선언하여 -1일 경우 t[i+1][j]에 t[i][j]를 더해주고
temp = t[i+1][j]를 할당하여 더해주기 전 값을 임시로 저장해둔다.
그리고 t[i+1][j+1] 에 t[i][j] 를 더해주고 다음 반복으로 넘어간다.
다음 반복(loop)에서 temp가 -1이 아니므로 현재 t[i+1][j]와 temp + t[i][j]를 비교하여 더 큰 값을 재할당한다.
위와 같이 반복문을 수행하면 조건과 일치하는 결과를 만들 수 있다.
마지막 행에서 가장 큰 수를 찾으면 정답을 찾을 수 있다.
참고할 만한 정답
- 아래에서 위의 2개 값 더하기
class Solution {
public int solution(int[][] triangle) {
int answer = 0; //max
int[][] t = triangle;
for(int i=1; i<t.length; i++){
for(int j=0; j<t[i].length; j++){
if(j == 0){
t[i][j] = t[i][j] + t[i - 1][j];
}else if(i == j){
t[i][j] = t[i][j] + t[i - 1][j -1];
}else{
int left = t[i][j] = t[i][j] + t[i - 1][j -1];
int right = t[i][j] = t[i][j] + t[i - 1][j];
t[i][j] = Math.max(left, right);
}
answer = Math.max(answer, t[i][j]);
}
}
return answer;
}
}
- 역으로 제일 밑에서 부터 상위의 1개에 값 더하기(역발상)
class Solution {
public int solution(int[][] triangle) {
int[][] t = triangle;
for(int i = t.length - 2; i>=0; i--){ // t.length -2는 가장 마지막 라인의 위쪽부터 계산되기 때문
for(int j=0; j<t[i].length; j++){
int left = t[i][j] + t[i+1][j];
int right = t[i][j] + t[i+1][j+1];
t[i][j] = Math.max(left, right);
}
}
return t[0]; //역으로 더하기 때문에 가장 초기값에 max 값이 더해짐
}
}
비교 분석
- 역발상으로 풀이한 정답이 가장 깔끔하게 풀이할 수 있는 방법이다.
반응형