본문 바로가기

About/Algorithm

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

출처 프로그래머스

https://programmers.co.kr/

 

프로그래머스

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

programmers.co.kr

문제

너무 복잡하게 생각해서 오래 걸렸던 문제이다 

생각보다 코드는 간단하게 나왔다.

 

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
#include <iostream>
#include <vector>
#define NUM_COLUMN 4
using namespace std;
int find_max(vector<int> v, int except) {
    int max = 0;
    for (int idx = 0; idx < v.size(); idx++) {
        if (max < v[idx] && idx != except)
            max = v[idx];
    }
    return max;
}
int solution(vector<vector<int> > land)
{
    int answer = 0;
    vector<vector<int>>::iterator viter = land.begin(), next;
    for (next = viter + 1; next != land.end(); next++) {
        for (int idx = 0; idx < NUM_COLUMN; idx++) {
            (*next)[idx] += find_max((*viter), idx);
        }
        viter = next;
    }
    return find_max((*viter), -1);
}

풀이를 하자면 

각 행마다 최댓값을 찾는 것이 아니라

같은 인덱스를 제외하고 가능한 최댓값들을 계속 찾아서 계속 더해준다.

마지막 누적 최댓값 중 가장 큰 수를 찾으면 정답이다.

 

샘플 테스트인 [[1,2,3,5], [5,6,7,8], [4,3,2,1]]로 보자면

 

         1   2   3   5   - viter

         5   6   7   8   - next

         --------------

누적   10 11  12  11  

 

         10  11  12  11   -viter

          4    3    2   1   -next    

         -----------------

누적    16  15   13  13

 

 

모든 행을 위와 같이 처리한 후 

누적된 최댓값들 중 가장 큰수는 16이므로 

정답은 16이다.