| 일 | 월 | 화 | 수 | 목 | 금 | 토 |
|---|---|---|---|---|---|---|
| 1 | 2 | |||||
| 3 | 4 | 5 | 6 | 7 | 8 | 9 |
| 10 | 11 | 12 | 13 | 14 | 15 | 16 |
| 17 | 18 | 19 | 20 | 21 | 22 | 23 |
| 24 | 25 | 26 | 27 | 28 | 29 | 30 |
| 31 |
Tags
- 알고리즘
- 백준
- 월간 코드 챌린지 시즌1
- 알고리즘고득점Kit
- 구현
- DP
- GIT
- 정렬
- 깃허브 프로필
- 이코테
- 정수 삼각형
- 자바
- Java
- BFS
- 프로그래멋
- 1932
- Lv2
- 깃허브
- Python
- 그래프탐색
- 분할정복
- Summer/Winter Coding(~2018)
- 15686
- 완전탐색
- 프로그래머스
- 다익스트라
- 그래프
- 토마토
- 조합
- dfs
Archives
- Today
- Total
갱스터하우스
[Java] 백준 1932.정수 삼각형 본문
➡️문제 링크
https://www.acmicpc.net/problem/1932
💡아이디어
DP
✏️문제 풀이
1. DP - 성공
대각선 왼쪽은 (j-1), 대각선 오른쪽은 j로 설정해서
현재 최댓값은 이전 라인의 대각선 왼쪽과 대각선 오른쪽 값 중 최댓값을 선택해 갱신하도록 했다
처음에는 result값에 가장 꼭대기에 있는 값을 초기값으로 설정해야하나 고민하다
본문에 있는 예제 테스트는 다 결과값이 나오길래 안 넣었는데
N = 1인 경우에는 틀려서 map[0][0]을 초기값으로 설정했다
import java.io.*;
import java.util.*;
public class Main {
public static void main(String[] args) throws IOException{
// TODO Auto-generated method stub
BufferedReader br = new BufferedReader(new InputStreamReader(System.in));
int N = Integer.parseInt(br.readLine());
int [][] map = new int[N][N];
for(int i = 0; i < N; i++) {
StringTokenizer st = new StringTokenizer(br.readLine());
for(int j = 0; j < i+1; j++) {
map[i][j] = Integer.parseInt(st.nextToken());
}
}
int result = map[0][0];
for(int i = 1; i < N; i++) {
for(int j = 0; j < i+1; j++) {
int left = 0;
int right = 0;
if(j-1 >= 0) left = map[i-1][j-1];
if(j <= i) right = map[i-1][j];
map[i][j] += Math.max(left, right);
result = Math.max(result, map[i][j]);
}
}
// 정답
System.out.println(result);
}
}
근데 left, right 부분이 지저분한 것 같아서 아래처럼 개선해봤다
import java.io.*;
import java.util.*;
public class Main {
public static void main(String[] args) throws IOException{
// TODO Auto-generated method stub
BufferedReader br = new BufferedReader(new InputStreamReader(System.in));
int N = Integer.parseInt(br.readLine());
int [][] map = new int[N][N];
for(int i = 0; i < N; i++) {
StringTokenizer st = new StringTokenizer(br.readLine());
for(int j = 0; j < i+1; j++) {
map[i][j] = Integer.parseInt(st.nextToken());
}
}
for(int i = 1; i < N; i++) {
for(int j = 0; j < i+1; j++) {
if(j == 0) map[i][j] += map[i-1][j]; // 맨 왼쪽
else if(j == i) map[i][j] += map[i-1][j-1]; // 맨 왼쪽
else map[i][j] += Math.max(map[i-1][j-1], map[i-1][j]);
}
}
int result = 0;
for(int i = 0; i < N; i++) {
result = Math.max(map[N-1][i], result);
}
// 정답
System.out.println(result);
}
}
2. bottom up 접근 - 성공
뭔가 아쉬움을 느껴 다른 사람들의 풀이를 보다 bottom up으로 접근한 풀이가 보였다
이렇게 접근하니 if-else if-else로 나눈 내 방법도
현재 선택할 수 있는 두 값이 바로 보였다.
import java.io.*;
import java.util.*;
public class Main {
public static void main(String[] args) throws IOException{
// TODO Auto-generated method stub
BufferedReader br = new BufferedReader(new InputStreamReader(System.in));
int N = Integer.parseInt(br.readLine());
int [][] map = new int[N][N];
for(int i = 0; i < N; i++) {
StringTokenizer st = new StringTokenizer(br.readLine());
for(int j = 0; j < i+1; j++) {
map[i][j] = Integer.parseInt(st.nextToken());
}
}
for(int i = N-2; i >= 0; i--) {
for(int j = 0; j <= i; j++) {
map[i][j] += Math.max(map[i+1][j], map[i+1][j+1]);
}
}
// 정답
System.out.println(map[0][0]);
}
}
이번 문제를 풀며 "생각의 전환"이 중요하다고 느꼈다
'코테 문제 > 백준' 카테고리의 다른 글
| [Java] 백준 11660.구간 합 구하기 5 (0) | 2026.02.25 |
|---|---|
| [Java] 백준 1629.곱셈 (0) | 2026.02.25 |
| [Java] 백준 1149.RGB거리 (0) | 2026.02.24 |
| [Java] 백준 16953.A → B (0) | 2026.02.23 |
| [Java] 백준 11725.트리의 부모 찾기 (0) | 2026.02.23 |