티스토리 뷰
프로그래머스 43105번 - 정수 삼각형
요구사항
1. 삼각형의 꼭대기에서 바닥까지 이어지는 경로 중, 거쳐간 숫자의 최댓값을 반환하라.
2. 단, 아래 칸으로 이동할 때는 대각선 방향으로 한 칸 오른쪽 또는 왼쪽으로만 이동 가능합니다.
요구사항 분석 및 풀이과정
1. 주어진 삼각형은 시각적인 표현이고, 삼각형을 배열로 보면 다음과 같습니다.
2. 시각적으로 표현된 삼각형 기준으로 아래 칸으로 이동할 때 대각선 방향으로 한 칸 오른쪽 또는 왼쪽이기 때문에, 위 모양을 기준으로는 아래 방향 또는 우측 하단 대각선 방향으로만 이동이 가능합니다.
3. 2번을 경유해오는 칸을 도착하는 칸을 시점으로 보면 왼쪽 상단 대각선 방향 또는 위쪽 방향에서 올 수 있습니다. 그림으로 표현해보면 다음과 같습니다.
4. 3번을 고려하여 주어진 규칙대로 계산하면 됩니다. 단, 계산의 편의를 위하여 구역을 3 부분으로 나누어 계산하겠습니다.
빨간색 구역은 위쪽 칸에서만, 파란색 구역은 왼쪽 상단 대각선 칸에서만, 초록색 구역은 왼쪽 상단 대각선 칸 또는 위쪽 칸에서만 올 수 있습니다.
빨간색 구역의 경우는 규칙에 의하여 위쪽 칸의 값만 누적하여 더해주면 됩니다. 파란색 구역 또한 왼쪽 상단 대각선 칸의 값만 누적하여 더해주면 됩니다. 또한 두 구역은 계산에 필요한 칸의 값이 서로 독립적이므로 구역의 계산 순서가 중요하지 않습니다.
하지만 초록색 구역의 경우는 계산을 위하여 이미 계산된 빨간색 구역과 파란색 구역의 값이 필요하므로, 가장 나중에 계산을 해주어야 합니다.
이때 초록색 구역은 규칙에 의하여 위쪽 칸의 값과 왼쪽 상단 대각선 칸의 값 중 큰 값을 선택하여 누적하여 더해주면 됩니다.
각 칸의 값은 양수이므로 아래 방향으로 내려가면서 거쳐간 숫자의 합은 증가하게 되고, 가장 마지막 줄에서 가장 큰 수가 삼각형의 꼭대기에서 바닥까지 이어지는 경로 중 거쳐간 숫자의 최댓값입니다.
소스코드 작성
import java.util.Arrays;
class Solution {
public int solution(int[][] triangle) {
for (int row = 1; row < triangle.length; row++) {
triangle[row][0] += triangle[row-1][0]; // 빨간 구역
triangle[row][row] += triangle[row-1][row-1]; // 파란 구역
// 초록 구역
for (int col = 1; col < row; col++) {
triangle[row][col] += Math.max(triangle[row-1][col-1], triangle[row-1][col]);
}
}
return Arrays.stream(triangle[triangle.length-1]).max().getAsInt();
}
}
결과
소스코드 깃허브 주소
'코딩테스트 > 알고리즘' 카테고리의 다른 글
[알고리즘]프로그래머스 70129번 - 이진 변환 반복하기 (0) | 2022.01.18 |
---|---|
[알고리즘]프로그래머스 1844번 - 게임 맵 최단거리 (0) | 2022.01.18 |
[알고리즘]프로그래머스 42898번 - 등굣길 (0) | 2022.01.17 |
[알고리즘]프로그래머스 42861번 - 섬 연결하기 (0) | 2022.01.17 |
[알고리즘]프로그래머스 42577번 - 전화번호 목록 (0) | 2022.01.16 |
- Total
- Today
- Yesterday
- 해쉬
- Java
- 문자열
- 알고리즘
- 구현
- 코드 스니펫
- dp
- BFS
- k8s
- dsu
- 스트림
- 우선순위큐
- 정렬
- 연결리스트
- 오늘의집
- 회고
- TDD
- 코딩인터뷰
- 카카오
- 쓰레드
- 스택
- dfs
- set
- 비트연산
- 탐욕법
- JPA
- Uber
- kotlin
- 프로그래머스
- sql
일 | 월 | 화 | 수 | 목 | 금 | 토 |
---|---|---|---|---|---|---|
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 |