본문 바로가기
알고리즘/프로그래머스

프로그래머스 level 2 - 땅따먹기

by seongjun 2023. 1. 9.

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

 

프로그래머스

코드 중심의 개발자 채용. 스택 기반의 포지션 매칭. 프로그래머스의 개발자 맞춤형 프로필을 등록하고, 나와 기술 궁합이 잘 맞는 기업들을 매칭 받으세요.

programmers.co.kr

n행 4열 크기의 2차원 배열이 주어진다.

각 칸에는 모두 숫자가 있으며, 첫번 째 행부터 마지막 행까지 내려오면서 밟아온 숫자를 다 더했을 때 가장 큰 수를 구해야 한다.

이때, 바로 직전에 밟았던 열과 동일한 열을 밟으면 안된다. (ex. 1번 행에서 2번 열을 밟았을 시, 2번 행에서는 2번 열을 제외한 열만 밟을 수 있다.

 

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

int solution(vector<vector<int> > land)
{
    int answer = 0;
    // 반복문 돌면서 이전 행의 최댓값 더해주기(같은 열 제외)
    for(int i=1;i<land.size();i++){
        land[i][0] += max({land[i-1][1], land[i-1][2], land[i-1][3]});
        land[i][1] += max({land[i-1][0], land[i-1][2], land[i-1][3]});
        land[i][2] += max({land[i-1][0], land[i-1][1], land[i-1][3]});
        land[i][3] += max({land[i-1][0], land[i-1][1], land[i-1][2]});
    }
    // 위에서 다 더한 후, 마지막 행의 값들 중 가장 큰 값이 정답.
    answer = max({land[land.size()-1][0], land[land.size()-1][1], 
                 land[land.size()-1][2] ,land[land.size()-1][3]});
    return answer;
}