728x90

https://programmers.co.kr/learn/courses/30/lessons/12913

 

코딩테스트 연습 - 땅따먹기

땅따먹기 게임을 하려고 합니다. 땅따먹기 게임의 땅(land)은 총 N행 4열로 이루어져 있고, 모든 칸에는 점수가 쓰여 있습니다. 1행부터 땅을 밟으며 한 행씩 내려올 때, 각 행의 4칸 중 한 칸만 밟��

programmers.co.kr

#include <iostream>
#include <vector>
#include <algorithm>
using namespace std;

int solution(vector<vector<int> > land) {
	for (int i = 1; i < land.size(); i++) {
		land[i][0] = land[i][0] + max(max(land[i - 1][1], land[i - 1][2]), land[i - 1][3]);
		land[i][1] = land[i][1] + max(max(land[i - 1][0], land[i - 1][2]), land[i - 1][3]);
		land[i][2] = land[i][2] + max(max(land[i - 1][0], land[i - 1][1]), land[i - 1][3]);
		land[i][3] = land[i][3] + max(max(land[i - 1][0], land[i - 1][1]), land[i - 1][2]);
	}
	return max(max(max(land[land.size() - 1][0], land[land.size() - 1][1]), land[land.size() - 1][2]), land[land.size() - 1][3]);
}

동적계획법으로 풀었다. 메모리는 따로 사용하지 않았고 주어진 이차원 벡터에 그대로 덮어썼다.

(i행 0열)에 왔다는 것은 i - 1행에서는 0열이 아닌 1열 또는 2열 또는 3열을 거쳤다는 것이기 때문에 (i행 0열)의 값에 (i - 1행 1열), (i - 1행 2열), (i - 1행 3열) 중 최댓값을 더해주었다. 그러면 land[i][0]에는 i행 0열까지 오는 경로 중 가장 최댓값을 가질 수 있는 경로로 왔을 때의 점수가 저장되어있는 것이다. 그런식으로 누적해서 더해서 land[마지막 행]에는 각 열의 최댓값 4개가 저장되어 있다. (4열이기 때문) 그 4개의 숫자 중에서 최댓값이 정답이 된다.

728x90

'알고리즘 문제' 카테고리의 다른 글

[프로그래머스] 기능개발  (0) 2020.07.31
[프로그래머스] 큰 수 만들기  (0) 2020.07.30
[프로그래머스] 폰켓몬  (0) 2020.07.28
[백준] 1780번 종이의 개수  (0) 2020.04.11
[백준] N M 찍기  (0) 2020.04.11

+ Recent posts