[c++] BOJ 1947 :: ์š•์‹ฌ์Ÿ์ด ํŒ๋‹ค

๋‚œ์ด๋„ : ๊ณจ๋“œ 3

๊ฑธ๋ฆฐ ์‹œ๊ฐ„ : 20๋ถ„

 

๋ฌธ์ œ

์š•์‹ฌ์Ÿ์ด ํŒ๋‹ค ๋ฌธ์ œ ๋ฐ”๋กœ๊ฐ€๊ธฐ

๋ฌธ์ œ

n*n์˜ ํฌ๊ธฐ์˜ ๋Œ€๋‚˜๋ฌด ์ˆฒ์ด ์žˆ๋‹ค. ์š•์‹ฌ์Ÿ์ด ํŒ๋‹ค๋Š” ์–ด๋–ค ์ง€์—ญ์—์„œ ๋Œ€๋‚˜๋ฌด๋ฅผ ๋จน๊ธฐ ์‹œ์ž‘ํ•œ๋‹ค. ๊ทธ๋ฆฌ๊ณ  ๊ทธ ๊ณณ์˜ ๋Œ€๋‚˜๋ฌด๋ฅผ ๋‹ค ๋จน์–ด ์น˜์šฐ๋ฉด ์ƒ, ํ•˜, ์ขŒ, ์šฐ ์ค‘ ํ•œ ๊ณณ์œผ๋กœ ์ด๋™์„ ํ•œ๋‹ค. ๊ทธ๋ฆฌ๊ณ  ๋˜ ๊ทธ๊ณณ์—์„œ ๋Œ€๋‚˜๋ฌด๋ฅผ ๋จน๋Š”๋‹ค. ๊ทธ๋Ÿฐ๋ฐ ๋‹จ ์กฐ๊ฑด์ด ์žˆ๋‹ค. ์ด ํŒ๋‹ค๋Š” ๋งค์šฐ ์š•์‹ฌ์ด ๋งŽ์•„์„œ ๋Œ€๋‚˜๋ฌด๋ฅผ ๋จน๊ณ  ์ž๋ฆฌ๋ฅผ ์˜ฎ๊ธฐ๋ฉด ๊ทธ ์˜ฎ๊ธด ์ง€์—ญ์— ๊ทธ ์ „ ์ง€์—ญ๋ณด๋‹ค ๋Œ€๋‚˜๋ฌด๊ฐ€ ๋งŽ์ด ์žˆ์–ด์•ผ ํ•œ๋‹ค. ๋งŒ์•ฝ์— ๊ทธ๋Ÿฐ ์ง€์ ์ด ์—†์œผ๋ฉด ์ด ํŒ๋‹ค๋Š” ๋ถˆ๋งŒ์„ ๊ฐ€์ง€๊ณ  ๋‹จ์‹ ํˆฌ์Ÿ์„ ํ•˜๋‹ค๊ฐ€ ์ฃฝ๊ฒŒ ๋œ๋‹ค(-_-)

์ด ํŒ๋‹ค์˜ ์‚ฌ์œก์‚ฌ๋Š” ์ด๋Ÿฐ ํŒ๋‹ค๋ฅผ ๋Œ€๋‚˜๋ฌด ์ˆฒ์— ํ’€์–ด ๋†“์•„์•ผ ํ•˜๋Š”๋ฐ, ์–ด๋–ค ์ง€์ ์— ์ฒ˜์Œ์— ํ’€์–ด ๋†“์•„์•ผ ํ•˜๊ณ , ์–ด๋–ค ๊ณณ์œผ๋กœ ์ด๋™์„ ์‹œ์ผœ์•ผ ๋‘˜ ๋‹ค ์†Œ์ค‘ํ•œ ์ƒ๋ช…์ด์ง€๋งŒ ํŒ๋‹ค๊ฐ€ ์ตœ๋Œ€ํ•œ ์˜ค๋ž˜ ์‚ด ์ˆ˜ ์žˆ๋Š”์ง€ ๊ณ ๋ฏผ์— ๋น ์ ธ ์žˆ๋‹ค. ์šฐ๋ฆฌ์˜ ์ž„๋ฌด๋Š” ์ด ์‚ฌ์œก์‚ฌ๋ฅผ ๋„์™€์ฃผ๋Š” ๊ฒƒ์ด๋‹ค. n*n ํฌ๊ธฐ์˜ ๋Œ€๋‚˜๋ฌด ์ˆฒ์ด ์ฃผ์–ด์ ธ ์žˆ์„ ๋•Œ, ์ด ํŒ๋‹ค๊ฐ€ ์ตœ๋Œ€ํ•œ ์˜ค๋ž˜ ์‚ด๋ ค๋ฉด ์–ด๋–ค ๊ฒฝ๋กœ๋ฅผ ํ†ตํ•˜์—ฌ ์›€์ง์—ฌ์•ผ ํ•˜๋Š”์ง€ ๊ตฌํ•˜์—ฌ๋ผ.

์ž…๋ ฅ

์ฒซ์งธ ์ค„์— ๋Œ€๋‚˜๋ฌด ์ˆฒ์˜ ํฌ๊ธฐ n(1 ≤ n ≤ 500)์ด ์ฃผ์–ด์ง„๋‹ค. ๊ทธ๋ฆฌ๊ณ  ๋‘˜์งธ ์ค„๋ถ€ํ„ฐ n+1๋ฒˆ์งธ ์ค„๊นŒ์ง€ ๋Œ€๋‚˜๋ฌด ์ˆฒ์˜ ์ •๋ณด๊ฐ€ ์ฃผ์–ด์ง„๋‹ค. ๋Œ€๋‚˜๋ฌด ์ˆฒ์˜ ์ •๋ณด๋Š” ๊ณต๋ฐฑ์„ ์‚ฌ์ด๋กœ ๋‘๊ณ  ๊ฐ ์ง€์—ญ์˜ ๋Œ€๋‚˜๋ฌด์˜ ์–‘์ด ์ •์ˆ˜ ๊ฐ’์œผ๋กœ ์ฃผ์–ด์ง„๋‹ค. ๋Œ€๋‚˜๋ฌด์˜ ์–‘์€ 1,000,000๋ณด๋‹ค ์ž‘๊ฑฐ๋‚˜ ๊ฐ™์€ ์ž์—ฐ์ˆ˜์ด๋‹ค.

 

ํ’€์ด

  • ์™„์ „ํƒ์ƒ‰ : ๋ชจ๋“  ๋ฐฐ์—ด ์š”์†Œ์—์„œ ์‹œ์ž‘ํ•ด์„œ ๊ฒฝ๋กœ๋ฅผ ํƒ€๊ณ  ๋“ค์–ด๊ฐ€๋ฉด์„œ ๊ฐ€์žฅ ๊ธด ๊ฒฝ๋กœ ์ฐพ๊ธฐ
  • ์ž‘์€ ๋ฌธ์ œ : ํ•ด๋‹น ์ž๋ฆฌ์—์„œ ๊ฐ€์žฅ ํƒ€๊ณ  ๋“ค์–ด๊ฐˆ ์ˆ˜ ์žˆ๋Š” ๊ฒฝ๋กœ์˜ ๊ธธ์ด
  • ์žฌ๊ท€ ํ•จ์ˆ˜ : (ํ˜„์žฌ ์ž๋ฆฌ) => ๊ฒฝ๋กœ ๊ธธ์ด
    • ์ข…๋ฃŒ ์กฐ๊ฑด : ์ƒํ•˜์ขŒ์šฐ์— ๊ฐˆ ์ˆ˜ ์žˆ๋Š” ๊ณณ์ด ์—†์„ ๋•Œ
  • DP : ๊ฒฝ๋กœ ๊ธธ์ด๋ฅผ ์ €์žฅํ•ด์„œ ์‚ฌ์šฉ
  • ์‹์œผ๋กœ ํ‘œํ˜„ : arr[i][j] = (์ž์‹ ๋ณด๋‹ค ๋†’์€ ๋„ค ๋ฐฉํ–ฅ์˜ arr[k][l] ์ค‘ max) + 1 (top down ๋ฐฉ์‹)
    • ๋„ค ๋ฐฉํ–ฅ์˜ arr ๊ฐ’์ด ๊ฒฐ์ •๋˜์ง€ ์•Š์•˜๊ธฐ ๋•Œ๋ฌธ์— ์‹์œผ๋กœ ํ’€ ์ˆ˜ ์—†์Œ => ํ•œ ๋ฐฉํ–ฅ์œผ๋กœ ํ˜๋Ÿฌ๊ฐ€์ง€ ์•Š์Œ
    • ์žฌ๊ท€ํ•จ์ˆ˜๋กœ ํ’€์ž!

์ฝ”๋“œ

#include <iostream>
#include <cstring>

using namespace std;

int n;
int direction[4][2] = { {-1,0}, {0, 1}, {1, 0}, {0, -1} };
int tree[501][501];
int memo[501][501];

int maxLivingDay(int r, int c) {
    if (memo[r][c] != -1)
        return memo[r][c];
    memo[r][c] = 1;
    for (int k = 0; k < 4; k++) {
        // ์ƒํ•˜์ขŒ์šฐ
        int row = r + direction[k][0];
        int col = c + direction[k][1];
        if (row < 0 || row >= n || col < 0 || col >= n) continue; // ๋งต์„ ๋ฒ—์–ด๋‚˜๋ฉด
        if (tree[r][c] >= tree[row][col]) continue; // ๋” ์ ์€ ๊ณณ์œผ๋กœ๋Š” x
        if (memo[row][col] != -1) {
            memo[r][c] = max(memo[r][c], memo[row][col]+1);
            continue;
        }
        memo[r][c] = max(memo[r][c], maxLivingDay(row, col)+1);
    }
    return memo[r][c];
}

int main() {
    // 09: 53 ์‹œ์ž‘ => 10:15 ๋ (20๋ถ„!)

    // ์ž…๋ ฅ ๋ฐ›๊ธฐ
    cin >> n;
    for (int i = 0; i < n; i++) {
        for (int j = 0; j < n; j++) {
            cin >> tree[i][j];
        }
    }

    // ์ดˆ๊ธฐํ™”
    memset(memo, -1, sizeof(memo));

    int res = 0;
    for (int i = 0; i < n; i++) {
        for (int j = 0; j < n; j++) {
            // ๊ฐ ์ž๋ฆฌ์—์„œ ์‹œ์ž‘ํ•ด์„œ
            res = max(res, maxLivingDay(i, j));
        }
    }
    cout << res << endl;
}

 

์ฃผ์˜ํ•  ์ 

  • ํ•œ ๋ฐฉํ–ฅ์ด ์•„๋‹Œ ์‚ฌ๋ฐฉ์œผ๋กœ ๊ฐˆ ์ˆ˜ ์žˆ๋Š” ์™„์ „ํƒ์ƒ‰์—์„œ๋Š” ํ•จ์ˆ˜์‹์„ ์ด์šฉํ•˜๊ธฐ ์–ด๋ ค์›€
๋ฐ˜์‘ํ˜•