본문 바로가기
알고리즘/백준

[BOJ 1937] 욕심쟁이 판다(c++)

by umdoyun 2025. 12. 12.
728x90

https://www.acmicpc.net/problem/1937

 

문제 개요

n × n 크기의 대나무 숲에서 판다가 이동할 수 있는 최대 칸 수를 구하는 문제입니다. 판다는 현재 위치보다 대나무가 더 많은 곳으로만 이동할 수 있습니다.

(1 ≤ n ≤ 500)

(1 ≤ 대나무 양 ≤ 1,000,000)


문제 풀이

DP를 활용하여 문제를 해결하였습니다. 대나무 양이 적은 곳부터 많은 곳 순서로 정렬을 하여 현재 칸을 방문할 때, 더 작은 값부터 최대 이동 칸 수를 DP에 저장하였습니다. 또한, 현재 위치보다 대나무가 적은 인접 칸의 DP값들을 이용해 빠르게 계산하였습니다.


코드

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

int n;
int coord[502][502];
int dp[502][502];

class node {
public:
    int x, y, val;
    bool operator < (const node& other) const {
        return val < other.val;
    }
};

vector<node> v;

int dx[4] = { 1, 0, -1, 0 };
int dy[4] = { 0, 1, 0, -1 };

int main() {
    ios::sync_with_stdio(0);
    cin.tie(0);
    cout.tie(0);
    
    cin >> n;
    
    // 입력 및 노드 저장
    for (int i = 1; i <= n; i++) {
        for (int j = 1; j <= n; j++) {
            cin >> coord[i][j];
            v.push_back({ i, j, coord[i][j] });
        }
    }
    
    // 대나무 양 기준 오름차순 정렬
    sort(v.begin(), v.end());
    
    int res = 0;
    
    // 작은 값부터 DP 계산
    for (node cur : v) {
        dp[cur.x][cur.y] = 1;  // 현재 칸
        
        // 4방향 탐색
        for (int i = 0; i < 4; i++) {
            int tx = cur.x + dx[i];
            int ty = cur.y + dy[i];
            
            // 현재 칸보다 대나무가 적은 인접 칸에서 올 수 있음
            if (coord[cur.x][cur.y] > coord[tx][ty]) {
                dp[cur.x][cur.y] = max(dp[cur.x][cur.y], dp[tx][ty] + 1);
            }
        }
        
        res = max(res, dp[cur.x][cur.y]);
    }
    
    cout << res;
    return 0;
}

'알고리즘 > 백준' 카테고리의 다른 글

[BOJ 15899] 트리와 색깔(c++)  (0) 2025.12.15
[BOJ 12764] 싸지방에 간 준하(c++)  (1) 2025.12.12
[BOJ 2461] 대표 선수(c++)  (0) 2025.12.12
[BOJ 3006] 터보소트(c++)  (0) 2025.12.08
[BOJ 17779] 게리맨더링2 (c++)  (0) 2025.12.03