Programmers/Level 2
C++ / 프로그래머스 / 땅따먹기
GitHubSeob
2023. 8. 16. 18:19
문제 |
https://school.programmers.co.kr/learn/courses/30/lessons/12913
프로그래머스
코드 중심의 개발자 채용. 스택 기반의 포지션 매칭. 프로그래머스의 개발자 맞춤형 프로필을 등록하고, 나와 기술 궁합이 잘 맞는 기업들을 매칭 받으세요.
programmers.co.kr
문제풀이 |
같은 열을 연속으로 밟을 수 없다.
그리고 입출력 예를 보면 다음 행의 칸에서 같은 열만 아니면 다 밟을 수 있으므로 DP를 이용하면 쉽게 풀 수 있다.
이전 행에서 같은 열만 제외하고 남은 3칸 중에서 가장 큰 누적값과 현재 밟은 칸의 값을 더해 저장하면 된다.
DP[y][0] = ( DP[y-1][1] or DP[y-1][2] or DP[y-1][3] ) + land[y][0];
이 값을 4칸 모두 구한다.
반복문이 종료되면 마지막 행에서 가장 큰 값을 return 하면 끝난다.
코드 |
#include <vector>
#include <algorithm>
using namespace std;
int get_max(int num1, int num2, int num3) {
return max(num1, max(num2, num3));
}
int solution(vector<vector<int>>land)
{
int answer(0);
vector<vector<int>>DP(land.size(), vector<int>(4));
for (int x = 0; x < 4; ++x) DP[0][x] = land[0][x];
for (int y = 1; y < DP.size(); ++y) {
DP[y][0] = get_max(DP[y - 1][1], DP[y - 1][2], DP[y - 1][3]) + land[y][0];
DP[y][1] = get_max(DP[y - 1][0], DP[y - 1][2], DP[y - 1][3]) + land[y][1];
DP[y][2] = get_max(DP[y - 1][0], DP[y - 1][1], DP[y - 1][3]) + land[y][2];
DP[y][3] = get_max(DP[y - 1][0], DP[y - 1][1], DP[y - 1][2]) + land[y][3];
}
for (int x = 0; x < 4; ++x) {
answer = max(answer, DP[DP.size() - 1][x]);
}
return answer;
}