본문 바로가기

ALGORITHM_PRACTICE

[프로그래머스] 땅따먹기

[프로그래머스] 땅따먹기

 

코딩테스트 연습 - 땅따먹기 | 프로그래머스

땅따먹기 게임을 하려고 합니다. 땅따먹기 게임의 땅(land)은 총 N행 4열로 이루어져 있고, 모든 칸에는 점수가 쓰여 있습니다. 1행부터 땅을 밟으며 한 행씩 내려올 때, 각 행의 4칸 중 한 칸만 밟으면서 내려와야 합니다. 단, 땅따먹기 게임에는 한 행씩 내려올 때, 같은 열을 연속해서 밟을 수 없는 특수 규칙이 있습니다. 예를 들면, | 1 | 2 | 3 | 5 | | 5 | 6 | 7 | 8 | | 4 | 3 | 2 | 1 | 로 땅이 주어졌다면

programmers.co.kr

 

단순히 DFS나 단순 for문으로 모든 경우를 탐색하는 경우에는 시간초과가 일어난다.

행의 갯수가 100000개라고 가정했을 때

4 * 3 * 3 * 3 * 3 ..... * 3 = 4 * 3^99999의 시간복잡도가 나오기 때문이다.

그렇기 때문에 이 문제는 dp를 사용하여 풀었다

이전의 행, 다른 열에서의 최댓값을 가져온다음 현재 행, 열의 값을 더해주고

마지막에 최댓값만 구해주면 되는 것이다.

 

dp[현재 행][현재 열] = land[현재 행][현재 열] + MAX([dp[이전 행][다른 열들]])

 

열이 4개 밖에 되지 않기 때문에 따로 for문 조건을 만들지 않았다.

 

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


int dp[100001][4];

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

'ALGORITHM_PRACTICE' 카테고리의 다른 글

[프로그래머스] 방문 길이  (0) 2019.12.08
[프로그래머스] 라면공장  (0) 2019.12.08
[프로그래머스] 입국심사  (0) 2019.12.06
[프로그래머스] 숫자 야구  (0) 2019.11.22
[프로그래머스] 여행경로  (0) 2019.09.27