프로그래머스
코드 중심의 개발자 채용. 스택 기반의 포지션 매칭. 프로그래머스의 개발자 맞춤형 프로필을 등록하고, 나와 기술 궁합이 잘 맞는 기업들을 매칭 받으세요.
programmers.co.kr
📄 문제
위와 같은 삼각형의 꼭대기에서 바닥까지 이어지는 경로 중, 거쳐간 숫자의 합이 가장 큰 경우를 찾아보려고 합니다. 아래 칸으로 이동할 때는 대각선 방향으로 한 칸 오른쪽 또는 왼쪽으로만 이동 가능합니다. 예를 들어 3에서는 그 아래칸의 8 또는 1로만 이동이 가능합니다.
삼각형의 정보가 담긴 배열 triangle이 매개변수로 주어질 때, 거쳐간 숫자의 최댓값을 return 하도록 solution 함수를 완성하세요.
ℹ️ 조건
삼각형의 높이는 1 이상 500 이하입니다.
삼각형을 이루고 있는 숫자는 0 이상 9,999 이하의 정수입니다.
📝 풀이
- bottom-up 방식으로 접근하여 문제를 해결하였습니다.
- 검사는 현재 노드에서 대각선 왼쪽과 오른쪽의 각 합을 검사하여 큰 값을 현재 노드에 저장하여 올라가는 방식으로 접근합니다.
- 맨 아래 배열의 한칸 위 "triangle.size() - 2" 부터 시작하여 0까지 올라갑니다.
- i의 값 + 1까지 검사하여 현재 행의 모든 노드를 검사합니다.
- 현재 노드에서 triangle[i + 1][j]와 triangle[i + 1][j + 1]의 합 중 더 큰 값을 현재 노드에 저장하여 검사합니다.
- 마지막 리턴은 triangle[0][0]입니다.
#include <vector>
using namespace std;
int solution(vector<vector<int>> triangle) {
// bottom-up 방식
// 맨 아래의 한칸 위 {2, 7, 4, 4} 부터 시작하여 맨 위까지 검사
for(int i = triangle.size() - 2; i >= 0; --i)
// 현재 칸에서 한칸 아래의 개수(+1)만큼 검사
for(int j = 0; j < i + 1; ++j)
// 현재 칸의 값은 현재칸 + 대각선 왼쪽, 대각선 아래쪽의 합 중 큰 값을 저장
triangle[i][j] += max(triangle[i + 1][j], triangle[i + 1][j + 1]);
return triangle[0][0];
}
'algorithms (C++)' 카테고리의 다른 글
[C++][프로그래머스] 네트워크(Union-Find) (1) | 2024.02.26 |
---|---|
[C++][프로그래머스] 단어 변환 (0) | 2024.02.26 |
[C++][백준 2579번] 계단오르기 (0) | 2023.12.11 |
[C++][백준 9095번] 1, 2, 3 더하기 (0) | 2023.12.11 |
[C++][백준 1463번] 1로 만들기 ⭐ (0) | 2023.12.11 |