print("와챠의 개발 기록장")
[백준]동적 계획법1/정수 삼각형/1932 풀이 JAVA 본문
반응형
문제

위 그림은 크기가 5인 정수 삼각형의 한 모습이다.
맨 위층 7부터 시작해서 아래에 있는 수 중 하나를 선택하여 아래층으로 내려올 때, 이제까지 선택된 수의 합이 최대가 되는 경로를 구하는 프로그램을 작성하라.
아래층에 있는 수는 현재 층에서 선택된 수의 대각선 왼쪽 또는 대각선 오른쪽에 있는 것 중에서만 선택할 수 있다.
삼각형의 크기는 1 이상 500 이하이다. 삼각형을 이루고 있는 각 수는 모두 정수이며, 범위는 0 이상 9999 이하이다.
입력
첫째 줄에 삼각형의 크기 n(1 ≤ n ≤ 500)이 주어지고, 둘째 줄부터 n+1번째 줄까지 정수 삼각형이 주어진다.
출력
첫째 줄에 합이 최대가 되는 경로에 있는 수의 합을 출력한다.
풀이 (JAVA)
This file contains hidden or bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
import java.io.*; | |
import java.util.StringTokenizer; | |
public class Main { | |
static int[][] arr; // 삼각형의 숫자들을 입력받을 배열 | |
// ex) arr[depth][intdex] : depth층의 index번째 요소 | |
// ex) arr[2][1] : 아래 그림으로 따지면 2층의 1번째 요소 = 5 | |
static Integer[][] dp; // 최댓값 경로를 저장할 배열 | |
// 트리라고 가정하고 설명하면, | |
// 부모의 왼쪽 자식과 오른쪽 자식 값 중 더 큰 값 + 부모 값을 다시 부모의 값에 저장함 | |
// 아래부터 위로 차례로 값을 저장해감 | |
/* ex)arr dp | |
1 10 // 10 = 9 + 1 | |
2 3 7 9 // 7 = 5 + 2. 9 = 6 + 3 | |
4 5 6 4 5 6 // 맨 아랫 층은 arr배열 그대로 | |
*/ | |
static int N; // 삼각형의 크기 | |
static int find(int depth, int index) { | |
if (depth == N - 1) // N층까지 도착하면 출력 | |
return dp[depth][index]; | |
// 아직 최댓값 경로를 저장하지 않았다면 | |
if (dp[depth][index] == null) | |
dp[depth][index] = Math.max(find(depth + 1, index), find(depth + 1, index + 1)) + arr[depth][index]; | |
// 부모 = 왼쪽 자식과 오른쪽 자식 중 더 큰 값 + 부모 값 | |
return dp[depth][index]; | |
} | |
public static void main(String[] args) throws IOException { | |
BufferedReader br = new BufferedReader(new InputStreamReader(System.in)); | |
StringTokenizer st; | |
// 입력 | |
N = Integer.parseInt(br.readLine()); | |
arr = new int[N][N]; // 삼격형의 숫자를 입력받을 배열 생성 | |
dp = new Integer[N][N]; // 최댓값 경로를 저장할 배열 생성 | |
for (int depth = 0; depth < N; depth++) { // N층 만큼 입력 | |
st = new StringTokenizer(br.readLine()); | |
for (int index = 0; index <= depth; index++)// 1층 = 요소 1개, 2틍 = 요소 2개...N층 = 요소 N개 | |
arr[depth][index] = Integer.parseInt(st.nextToken()); // depth층의 index번째 요소 | |
} | |
// 맨 아랫층은 arr배열 그대로(그래야 다음 층부터 최댓값을 고를 수 있음) | |
for (int i = 0; i < N; i++) | |
dp[N - 1][i] = arr[N - 1][i]; | |
// 출력 | |
System.out.println(find(0, 0)); | |
} | |
} |

원래는 dp를 Integer가 아니라 int로 선언했었다.
(그랬더니 메모리는 덜 잡았고 시간은 똑같이 걸렸다.)
그런데 int형으로 하면 디폴트가 0인데,
맨 아래층 값이 모두 0일 수도 있기 때문에...
디폴트 값이 null인 Integer배열을 써야 맞을 거 같다.
문제를 딱 보고 아 이렇게 하면 되겠다...! 라는 느낌이 오랜만에 들었다.
근데... 그 느낌이 틀렸다.ㅋ
좁은 시야로 보면 좁게 보기 쉬운 듯,,,
느낌을 코드로 짜는 것도 어려웠다...
문제 많이 풀어봐야지
반응형
'코딩 일기장 > CodingTest' 카테고리의 다른 글
[백준]동적 계획법1/RGB 거리/1149 풀이 JAVA (0) | 2021.01.19 |
---|---|
[백준]동적 계획법1/파도반 수열/9461 풀이 JAVA (0) | 2021.01.14 |
[백준]동적 계획법1/01타일/1904 풀이 JAVA (0) | 2021.01.12 |
[백준]동적 계획법1/신나는 함수 여행/9184 풀이 JAVA (0) | 2021.01.11 |
[백준]동적 계획법1/피보나치 함수/1003 풀이 JAVA (0) | 2021.01.06 |