프로그래머스

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

programmers.co.kr

 

풀이 방법

 

 

이 문제는 동적 계산법으로 접근하였다.

 

1 2 3 5
5 6 7 8
4 3 2 1

 

예를 들어 위의 표처럼 3행 4열의 땅이 있다고 할 때 같은 열을 연속으로 밟지 않도록 하며 그 행의 가장 큰 수를 더한다 할 때 한 칸씩 내려올 때마다 결과는 아래 표처럼 된다.

 

1 2 3 5
10 11 12 11
16 15 13 13

 

n+1 행의 i번째 칸에서의 최댓값은 표에서의 n + 1 행의 i 번째 칸의 값에 n행의 i번째 칸을 제외한 다른 칸의 값 중 가장 큰 값을 더한 값과 같다는 것을 알 수 있다. 

이를 통해 점화식을 세워보면 arr[n+1][i] += max;가 될 것이고 이를 기반으로 코드를 작성하였다.

 

 

1. 한 행에서 최대값을 찾는 함수를 작성한다.

2. i = 0부터 land.size()까지 각 행에 이전 행의 같은 열을 제외한 최대값을 더해주는 것을 반복한다.

3. 반복문이 끝난 후 land[land.size()-1]에서 최댓값을 찾아 리턴한다.

#include <iostream>
#include <vector>
#include <algorithm>

using namespace std;

int search_max(vector<int>& v, int idx){
    int temp = 0;
    for(int i = 0; i < 4; i++) {
        if(i == idx) continue;
        temp = max(temp, v[i]);
    }
        
    return temp;
}

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

'프로그래머스 > 2레벨' 카테고리의 다른 글

스킬트리/C++  (0) 2023.02.03
주차 요금 계산/C++  (0) 2023.01.20
k진수에서 소수 개수 구하기/C++  (0) 2023.01.18
124 나라의 숫자/C++  (0) 2023.01.17
할인 행사/C++  (0) 2023.01.17

+ Recent posts