[c++] ์•Œ๊ณ ๋ฆฌ์ฆ˜ ๋ฌธ์ œ ํ•ด๊ฒฐ ์ „๋žต 1๊ถŒ :: ์™ธ๋ฐœ ๋›ฐ๊ธฐ (๋ฌธ์ œ ID: JUMPGAME, ๋‚œ์ด๋„ : ํ•˜)

https://www.algospot.com/judge/problem/read/JUMPGAME

๋ฌธ์ œ

img

 ๋•…๋”ฐ๋จน๊ธฐ๋ฅผ ํ•˜๋‹ค ์งˆ๋ฆฐ ์žฌํ•˜์™€ ์˜ํ›ˆ์ด๋Š” ๋•…๋”ฐ๋จน๊ธฐ์˜ ๋ณ€์ข…์ธ ์ƒˆ๋กœ์šด ๊ฒŒ์ž„์„ ํ•˜๊ธฐ๋กœ ํ–ˆ์Šต๋‹ˆ๋‹ค. ์ด ๊ฒŒ์ž„์€ ๊ทธ๋ฆผ๊ณผ ๊ฐ™์ด n*n ํฌ๊ธฐ์˜ ๊ฒฉ์ž์— ๊ฐ 1๋ถ€ํ„ฐ 9 ์‚ฌ์ด์˜ ์ •์ˆ˜๋ฅผ ์“ด ์ƒํƒœ๋กœ ์‹œ์ž‘ํ•ฉ๋‹ˆ๋‹ค. ๊ฐ ์ฐจ๋ก€์ธ ์‚ฌ๋žŒ์€ ๋งจ ์™ผ์ชฝ ์œ— ์นธ์—์„œ ์‹œ์ž‘ํ•ด ์™ธ๋ฐœ๋กœ ๋›ฐ์–ด์„œ ์˜ค๋ฅธ์ชฝ ์•„๋ž˜ ์นธ์œผ๋กœ ๋‚ด๋ ค๊ฐ€์•ผ ํ•ฉ๋‹ˆ๋‹ค. ์ด ๋•Œ ๊ฐ ์นธ์— ์ ํ˜€ ์žˆ๋Š” ์ˆซ์ž๋งŒํผ ์˜ค๋ฅธ์ชฝ์ด๋‚˜ ์•„๋ž˜ ์นธ์œผ๋กœ ์›€์ง์ผ ์ˆ˜ ์žˆ์œผ๋ฉฐ, ์ค‘๊ฐ„์— ๊ฒŒ์ž„ํŒ ๋ฐ–์œผ๋กœ ๋ฒ—์–ด๋‚˜๋ฉด ์•ˆ ๋ฉ๋‹ˆ๋‹ค.

 ๊ท ํ˜•์„ ์žƒ์–ด์„œ ๋‹ค๋ฅธ ๋ฐœ๋กœ ์„œ๊ฑฐ๋‚˜ ๋„˜์–ด์ ธ๋„ ๊ฒŒ์ž„์—์„œ ์ง‘๋‹ˆ๋‹ค๋งŒ, ์žฌํ•˜์™€ ์˜ํ›ˆ์ด๋Š” ์ Š๊ณ  ํ™œ๊ธฐ์ฐจ๊ธฐ ๋•Œ๋ฌธ์— ์™ธ๋ฐœ๋กœ ๋›ฐ์–ด๋‹ค๋‹ˆ๋Š” ๊ฒƒ์€ ์•„๋ฌด๊ฒƒ๋„ ์•„๋‹™๋‹ˆ๋‹ค. ๋‹ค๋งŒ ๊ฑฑ์ •๋˜๋Š” ๊ฒƒ์€ ์ฃผ์–ด์ง„ ๊ฒŒ์ž„ํŒ์— ์‹œ์ž‘์ ์—์„œ ๋์ ์œผ๋กœ ๊ฐ€๋Š” ๋ฐฉ๋ฒ•์ด ์กด์žฌํ•˜์ง€ ์•Š์„ ์ˆ˜๋„ ์žˆ๋‹ค๋Š” ๊ฒƒ์ž…๋‹ˆ๋‹ค. ์˜ˆ๋ฅผ ๋“ค์–ด ๊ทธ๋ฆผ (a)์˜ ๊ฒŒ์ž„ํŒ์—์„œ๋Š” ์‚ฌ๊ฐํ˜•์œผ๋กœ ํ‘œ์‹œ๋œ ์นธ๋“ค์„ ํ†ตํ•ด ๋์— ๋„๋‹ฌํ•  ์ˆ˜ ์žˆ์ง€๋งŒ, ์ˆซ์ž๊ฐ€ ํ•˜๋‚˜ ๋ฐ”๋€ ๊ทธ๋ฆผ (b)์—์„œ๋Š” ๊ทธ๋Ÿด ์ˆ˜๊ฐ€ ์—†์Šต๋‹ˆ๋‹ค.

 ๊ฒŒ์ž„ํŒ์ด ์ฃผ์–ด์งˆ ๋•Œ ์™ผ์ชฝ ์œ„์˜ ์‹œ์ž‘์ ์—์„œ ์˜ค๋ฅธ์ชฝ ์•„๋ž˜์˜ ์‹œ์ž‘์ ์— ๋„๋‹ฌํ•  ์ˆ˜ ์žˆ๋Š” ๋ฐฉ๋ฒ•์ด ์žˆ๋Š”์ง€ ํ™•์ธํ•˜๋Š” ํ”„๋กœ๊ทธ๋žจ์„ ์ž‘์„ฑํ•˜์„ธ์š”.

์ž…๋ ฅ

 ์ž…๋ ฅ์˜ ์ฒซ ์ค„์—๋Š” ํ…Œ์ŠคํŠธ ์ผ€์ด์Šค์˜ ์ˆ˜ C(C <= 50)๊ฐ€ ์ฃผ์–ด์ง‘๋‹ˆ๋‹ค. ๊ฐ ํ…Œ์ŠคํŠธ ์ผ€์ด์Šค์˜ ์ฒซ ์ค„์—๋Š” ๊ฒฉ์ž์˜ ํฌ๊ธฐ n(2 <= n <= 100)์ด ์ฃผ์–ด์ง€๊ณ , ๊ทธ ํ›„ n์ค„์— ๊ฐ n๊ฐœ์˜ ์ˆซ์ž๋กœ ์™ผ์ชฝ ์œ„๋ถ€ํ„ฐ ๊ฐ ์นธ์— ์“ฐ์ธ ์ˆซ์ž๋“ค์ด ์ฃผ์–ด์ง‘๋‹ˆ๋‹ค. ์˜ค๋ฅธ์ชฝ ์•„๋ž˜ ์žˆ๋Š” ๋ ์  ์œ„์น˜์—๋Š” 0์ด ์ฃผ์–ด์ง‘๋‹ˆ๋‹ค.

์ถœ๋ ฅ

 ๊ฐ ํ…Œ์ŠคํŠธ ์ผ€์ด์Šค๋งˆ๋‹ค ํ•œ ์ค„๋กœ, ์‹œ์ž‘์ ์—์„œ ๋ ์ ์œผ๋กœ ๋„๋‹ฌํ•  ์ˆ˜ ์žˆ์„ ๊ฒฝ์šฐ "YES"๋ฅผ, ์•„๋‹ ๊ฒฝ์šฐ "NO"๋ฅผ ์ถœ๋ ฅํ•ฉ๋‹ˆ๋‹ค. (๋”ฐ์˜ดํ‘œ ์ œ์™ธ)

๋‚˜์˜ ๋‹ต
#include <iostream>
#include <algorithm>
#include <queue>
#include <vector>


using namespace std;

int main() {
    int test_case;
    cin >> test_case;
    while (test_case--) {
        int n;
        cin >> n;
        int** arr = (int**)malloc(n * sizeof(int*));
        for (int i = 0; i < n; i++) {
            arr[i] = (int*)malloc(n * sizeof(int));
        }

        for (int i = 0; i < n; i++) {
            for (int j = 0; j < n; j++) {
                cin >> arr[i][j];
            }
        }

        queue<pair<int, int>> num_q;
        num_q.push(make_pair(0, 0));

        vector<vector<int>> check(n, vector<int>(n));

        while (num_q.size()) {
            int y = num_q.front().first; int x = num_q.front().second;
            num_q.pop();
            check[y][x] = 1;
            if (y == (n - 1) && x == (n - 1))
                break;

            int jump = arr[y][x];

            if (y + jump < n && !check[y + jump][x]) // ์•„๋ž˜์ชฝ
                num_q.push(make_pair(y + jump, x));
            if (x + jump < n && !check[y][x + jump]) // ์˜ค๋ฅธ์ชฝ
                num_q.push(make_pair(y, x + jump));
        }
        if (check[n - 1][n - 1])
            cout << "YES";
        else
            cout << "NO";
    }
}

 ์ผ๋‹จ ์†์œผ๋กœ ์•Œ๊ณ ๋ฆฌ์ฆ˜์„ ์งค ๋•Œ, Queue๋ฅผ ์ด์šฉํ•œ bfs๋ฅผ ํ™œ์šฉํ•ด์•ผ๊ฒ ๋‹ค๋Š” ์ƒ๊ฐ์„ ํ–ˆ๊ณ  queue์— ๋“ค์–ด๊ฐˆ ์ˆ˜ ์žˆ๋Š” ์œ„์น˜์˜ ์กฐ๊ฑด์€ ๋งต ์•ˆ์ด๊ณ , ์•„์ง ๋“ค๋ฅด์ง€ ์•Š์€ ๊ณณ์ด์—ˆ๋‹ค. ๋˜ํ•œ ๊ธฐ์ €์‚ฌ๋ก€๋Š” queue๊ฐ€ ๋น„๊ฑฐ๋‚˜ ๋์— ๋‹ค๋‹ค๋ฅธ ๊ฒฝ์šฐ์ด๋‹ค.

 

 ์œ„์—์„œ ๊ตฌํ˜„ ํŒจํ„ด์„ ์ƒ๊ฐํ•ด๋ดค๋“ฏ์ด ๊ธฐ์ €์‚ฌ๋ก€์ธ queue๊ฐ€ ๋น„๊ฑฐ๋‚˜ ๋์— ๋‹ค๋‹ค๋ฅธ ๊ฒฝ์šฐ๋Š” ์•ž๋ถ€๋ถ„์— ๋ฐฐ์น˜ํ•˜์—ฌ ์˜ค๋ฅ˜๊ฐ€ ์—†๋„๋ก ํ•˜์˜€๊ณ , memset์€ ์‚ฌ์šฉํ•  ์ƒ๊ฐ์„ ๋ชปํ•˜์˜€๋Š”๋ฐ ๋“ค๋ฅธ ๊ณณ์„ ์ฒดํฌํ•˜๋Š” check์˜ ์ž๋ฃŒ๊ตฌ์กฐ๋ฅผ 2์ฐจ์› vector๋กœ ์ •์˜ํ•˜์—ฌ ์ž๋™ ์ดˆ๊ธฐํ™”ํ•˜๊ธฐ ์‰ฌ์›Œ์„œ ๊ดœ์ฐฎ์•˜๋‹ค.

์žฌ๊ท€ ํ˜ธ์ถœ์—์„œ ์‹œ์ž‘ํ•˜๊ธฐ

 ์ฑ…์—์„œ๋Š” ์žฌ๊ท€ ํ˜ธ์ถœ์„ ๊ตฌํ˜„ํ•œ ํ›„, ๋ฉ”๋ชจ์ด์ œ์ด์…˜์„ ํ†ตํ•ด ์ค‘๋ณต๋˜๋Š” ๊ฒฝ์šฐ๋ฅผ ์ œ๊ฑฐํ•˜์˜€๋‹ค. ๋”ฐ๋ผ์„œ bfs ๋ฐฉ์‹์„ ์“ด ๋ณธ์ธ๊ณผ๋Š” ์กฐ๊ธˆ์˜ ์ฐจ์ด๊ฐ€ ์žˆ์—ˆ๋‹ค.

๋ฐ˜์‘ํ˜•