[c++] BOJ 1520 :: ๋‚ด๋ฆฌ๋ง‰๊ธธ

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

๊ฑธ๋ฆฐ ์‹œ๊ฐ„ : 1์‹œ๊ฐ„ ๋ฐ˜ ์ด์ƒ

 

๋ฌธ์ œ

๋ฌธ์ œ ๋ฐ”๋กœ๊ฐ€๊ธฐ

 

ํ’€์ด

  • ์šฐ์„  ์™„์ „ํƒ์ƒ‰์œผ๋กœ ํ•ด๋‹น ๋ฌธ์ œ๋ฅผ ์ƒ๊ฐํ•ด๋ณธ๋‹ค.
  • ์™„์ „ํƒ์ƒ‰์œผ๋กœ ๊ตฌํ˜„ํ•œ๋‹ค๋ฉด dfs๋ฅผ ์‚ฌ์šฉํ•ด์„œ ์žฌ๊ท€๋กœ ๊ตฌํ˜„ํ•  ๊ฒƒ์ด๋‹ค.
  • ์žฌ๊ท€์˜ ๋งค๊ฐœ๋ณ€์ˆ˜(๋ฐ›๋Š” ์ •๋ณด)๋Š” ํ˜„์žฌ ์œ„์น˜์ผ ๊ฒƒ์ด๊ณ , ๋‚ด๋ณด๋‚ด๋Š” ์ •๋ณด๋Š” ํ˜„์žฌ ์œ„์น˜์—์„œ ๋งˆ์ง€๋ง‰๊นŒ์ง€์˜ ๊ฒฝ๋กœ์˜ ์ˆ˜์ผ ๊ฒƒ์ด๋‹ค.
  • (0,0)์„ ์ฒ˜์Œ์œผ๋กœ ์žฌ๊ท€ํ•จ์ˆ˜์— ๋„˜๊ธฐ๋ฉด (0,0)์—์„œ ๋๊นŒ์ง€์˜ ๊ฒฝ๋กœ์˜ ์ˆ˜์ด๋ฏ€๋กœ ์šฐ๋ฆฌ๊ฐ€ ์›ํ•˜๋Š” ๋‹ต์ด ๋‚˜์˜จ๋‹ค.
  • ์žฌ๊ท€๋Š” ์œ„, ์˜ค๋ฅธ์ชฝ, ์•„๋ž˜, ์™ผ์ชฝ์œผ๋กœ ์ ‘ํ•œ ๋ถ€๋ถ„์œผ๋กœ ์˜ฎ๊ฒจ๊ฐ€๋ฉฐ ํ•ด๋‹น ์žฅ์†Œ์˜ ๊ฒฝ๋กœ์˜ ์ˆ˜๋ฅผ ํ˜„์žฌ ์žฅ์†Œ์˜ ๊ฒฝ๋กœ์˜ ์ˆ˜์— ๋”ํ•˜๋Š” ๋ฐฉ์‹์œผ๋กœ ์ง„ํ–‰๋œ๋‹ค.
    • ์ด ๋•Œ, ์žฅ์†Œ๋Š” ๋งต ์•ˆ์— ์žˆ์–ด์•ผํ•œ๋‹ค.
    • ์ด ๋•Œ, ๋‚ด๋ฆฌ๋ง‰๊ธธ๋กœ๋งŒ ๊ฐˆ ์ˆ˜ ์žˆ์œผ๋ฏ€๋กœ ํ˜„์žฌ๋ณด๋‹ค ๋” ๋†’์€ ์ˆ˜๋ฅผ ๊ฐ€์ง„ ์žฅ์†Œ๋Š” ์ œ์™ธ์ด๋‹ค.
  • ์ด๋ ‡๊ฒŒ ๊ตฌ์„ฑํ•˜๋ฉด ๊ฐ”๋˜ ๊ณณ์„ ๋˜ ๊ฐ€๋Š” ๊ฒฝ์šฐ๊ฐ€ ์ƒ๊ธฐ๋ฏ€๋กœ DP๋ฅผ ์ด์šฉํ•œ๋‹ค.
  • ์žฌ๊ท€ํ•จ์ˆ˜์˜ return ์กฐ๊ฑด
    • ์žฌ๊ท€ํ•จ์ˆ˜ ์ดˆ๋ฐ˜์— memo๋œ ๊ฒฝ๋กœ์˜ ์ˆ˜๊ฐ€ ์žˆ๋‹ค๋ฉด ํ•ด๋‹น ๊ฒฝ๋กœ์˜ ์ˆ˜๋ฅผ ๋„˜๊ฒจ์ค€๋‹ค.
    • ์žฌ๊ท€ํ•จ์ˆ˜ ์ดˆ๋ฐ˜์— ํ˜„์žฌ ์œ„์น˜๊ฐ€ ๋(M-1, N-1)์ด๋ผ๋ฉด 1์„ ๋„˜๊ฒจ์ค€๋‹ค.

 

์ฝ”๋“œ

#include <iostream>
#include <vector>
#include <cstring>

using namespace std;

int M, N;
int arr[500][500];
int memo[500][500];
// ์˜ค => ์•„ => ์™ผ => ์œ„
int direction[4][2] = { {0, 1}, {1, 0}, {0, -1}, {-1, 0} };

bool isThereBad(int r, int c) {
    // ๋งต ์•ˆ์— ์žˆ๋Š”์ง€ ํ™•์ธ
    return (r < 0 || c < 0 || r >= M || c >= N);
}

int returnPathNum(int r, int c) {
    if (memo[r][c] != -1)
        return memo[r][c];
    memo[r][c] = 0;
    for (int i = 0; i < 4; i++) {
        int row = r + direction[i][0];
        int col = c + direction[i][1];
        if (isThereBad(row, col))
            continue;
        if (arr[r][c] <= arr[row][col])
            continue;
        // ๋‚ด๋ฆฌ๋ง‰์ผ ๋•Œ
        memo[r][c] += returnPathNum(row, col);
    }
    return memo[r][c];
}

int main() {
    // ์ƒ๊ฐ์˜ ํ๋ฆ„
    // ์™„์ „ ํƒ์ƒ‰์œผ๋กœ ๊ตฌ์„ฑํ•œ๋‹ค๋ฉด, ์ตœ๋‹จ ๊ฒฝ๋กœ๊ฐ€ ์•„๋‹ˆ๋ฏ€๋กœ dfs ๊ณ ๋ ค
    // ์žฌ๊ท€๋กœ ๊ตฌํ˜„ํ• ํ…Œ๊ณ  ์žฌ๊ท€ํ•จ์ˆ˜์—์„œ DP๋กœ returnํ•ด์ค„ ์ˆ˜ ์žˆ๊ฒŒ ๊ตฌํ˜„
    // ์žฌ๊ท€๋กœ ๊ตฌํ˜„ํ•˜๋ฉด ๋ฐ›๋Š” ์ •๋ณด๋Š” ํ˜„์žฌ ์œ„์น˜, ๋‚ด๋ณด๋‚ด๋Š” ์ •๋ณด๋Š” ํ˜„์žฌ ์œ„์น˜์—์„œ ๊ฐ€์งˆ ์ˆ˜ ์žˆ๋Š” ๊ฒฝ๋กœ์˜ ๊ฐ’
    // ํ˜„์žฌ ์œ„์น˜์—์„œ ๋ชฉ์ ์ง€๊นŒ์ง€ ๊ฐˆ ์ˆ˜ ์žˆ๋Š” ๊ฒฝ๋กœ์˜ ๊ฐฏ์ˆ˜ = ์ฃผ์œ„์˜ ๋‚ฎ์€ ๊ณณ์œผ๋กœ๋ถ€ํ„ฐ ์˜ค๋Š” ๊ฒฝ๋กœ์˜ ํ•ฉ
    // ๋น ์ ธ๋‚˜๊ฐ€๋Š” ์กฐ๊ฑด : M-1, N-1 ์ผ ๋•Œ 1
    // memo ๋˜์–ด์žˆ์„ ๋•Œ memo๊ฐ’
    // memo๋Š” ๊ฒฝ๋กœ์˜ ๊ฐฏ์ˆ˜๋ฅผ ๊ตฌํ•˜๊ณ  ๋‚˜์„œ ํ‘œ์‹œ

    // ์ž…๋ ฅ ๋ฐ›๊ธฐ
    cin >> M >> N;
    for (int i = 0; i < M; i++) { // 10^5
        for (int j = 0; j < N; j++) {
            cin >> arr[i][j];
        }
    }
    memset(memo, -1, sizeof(memo));

    memo[M - 1][N - 1] = 1;
    cout << returnPathNum(0, 0);
}
  • ์ฃผ์˜ํ•  ๊ฒƒ
    • memset์„ ์ด์šฉํ•˜๋ ค๋ฉด cstring ๋ผ์ด๋ธŒ๋Ÿฌ๋ฆฌ๋ฅผ import ํ•ด์•ผํ•œ๋‹ค.

๊ฒฐ๊ณผ

๋ฐ˜์‘ํ˜•