Algorithm/๐Ÿ‘ ๋ฌธ์ œ

[14503] ๋กœ๋ด‡ ์ฒญ์†Œ๊ธฐ

YURI๐Ÿ•๐Ÿ“๐Ÿถ 2020. 9. 9. 11:09
๋ฐ˜์‘ํ˜•

๋กœ๋ด‡ ์ฒญ์†Œ๊ธฐ(๋ฌธ์ œ _ 14503)

๋กœ๋ด‡ ์ฒญ์†Œ๊ธฐ๊ฐ€ ์ฃผ์–ด์กŒ์„ ๋•Œ, ์ฒญ์†Œํ•˜๋Š” ์˜์—ญ์˜ ๊ฐœ์ˆ˜๋ฅผ ๊ตฌํ•˜๋Š” ํ”„๋กœ๊ทธ๋žจ์„ ์ž‘์„ฑํ•˜์‹œ์˜ค.

๋กœ๋ด‡ ์ฒญ์†Œ๊ธฐ๊ฐ€ ์žˆ๋Š” ์žฅ์†Œ๋Š” N×M ํฌ๊ธฐ์˜ ์ง์‚ฌ๊ฐํ˜•์œผ๋กœ ๋‚˜ํƒ€๋‚ผ ์ˆ˜ ์žˆ์œผ๋ฉฐ, 1×1ํฌ๊ธฐ์˜ ์ •์‚ฌ๊ฐํ˜• ์นธ์œผ๋กœ ๋‚˜๋ˆ„์–ด์ ธ ์žˆ๋‹ค. ๊ฐ๊ฐ์˜ ์นธ์€ ๋ฒฝ ๋˜๋Š” ๋นˆ ์นธ์ด๋‹ค. ์ฒญ์†Œ๊ธฐ๋Š” ๋ฐ”๋ผ๋ณด๋Š” ๋ฐฉํ–ฅ์ด ์žˆ์œผ๋ฉฐ, ์ด ๋ฐฉํ–ฅ์€ ๋™, ์„œ, ๋‚จ, ๋ถ์ค‘ ํ•˜๋‚˜์ด๋‹ค. ์ง€๋„์˜ ๊ฐ ์นธ์€ (r, c)๋กœ ๋‚˜ํƒ€๋‚ผ ์ˆ˜ ์žˆ๊ณ , r์€ ๋ถ์ชฝ์œผ๋กœ๋ถ€ํ„ฐ ๋–จ์–ด์ง„ ์นธ์˜ ๊ฐœ์ˆ˜, c๋Š” ์„œ์ชฝ์œผ๋กœ ๋ถ€ํ„ฐ ๋–จ์–ด์ง„ ์นธ์˜ ๊ฐœ์ˆ˜์ด๋‹ค.

๋กœ๋ด‡ ์ฒญ์†Œ๊ธฐ๋Š” ๋‹ค์Œ๊ณผ ๊ฐ™์ด ์ž‘๋™ํ•œ๋‹ค.

  1. ํ˜„์žฌ ์œ„์น˜๋ฅผ ์ฒญ์†Œํ•œ๋‹ค.
  2. ํ˜„์žฌ ์œ„์น˜์—์„œ ํ˜„์žฌ ๋ฐฉํ–ฅ์„ ๊ธฐ์ค€์œผ๋กœ ์™ผ์ชฝ๋ฐฉํ–ฅ๋ถ€ํ„ฐ ์ฐจ๋ก€๋Œ€๋กœ ํƒ์ƒ‰์„ ์ง„ํ–‰ํ•œ๋‹ค.
    1. ์™ผ์ชฝ ๋ฐฉํ–ฅ์— ์•„์ง ์ฒญ์†Œํ•˜์ง€ ์•Š์€ ๊ณต๊ฐ„์ด ์กด์žฌํ•œ๋‹ค๋ฉด, ๊ทธ ๋ฐฉํ–ฅ์œผ๋กœ ํšŒ์ „ํ•œ ๋‹ค์Œ ํ•œ ์นธ์„ ์ „์ง„ํ•˜๊ณ  1๋ฒˆ๋ถ€ํ„ฐ ์ง„ํ–‰ํ•œ๋‹ค.
    2. ์™ผ์ชฝ ๋ฐฉํ–ฅ์— ์ฒญ์†Œํ•  ๊ณต๊ฐ„์ด ์—†๋‹ค๋ฉด, ๊ทธ ๋ฐฉํ–ฅ์œผ๋กœ ํšŒ์ „ํ•˜๊ณ  2๋ฒˆ์œผ๋กœ ๋Œ์•„๊ฐ„๋‹ค.
    3. ๋„ค ๋ฐฉํ–ฅ ๋ชจ๋‘ ์ฒญ์†Œ๊ฐ€ ์ด๋ฏธ ๋˜์–ด์žˆ๊ฑฐ๋‚˜ ๋ฒฝ์ธ ๊ฒฝ์šฐ์—๋Š”, ๋ฐ”๋ผ๋ณด๋Š” ๋ฐฉํ–ฅ์„ ์œ ์ง€ํ•œ ์ฑ„๋กœ ํ•œ ์นธ ํ›„์ง„์„ ํ•˜๊ณ  2๋ฒˆ์œผ๋กœ ๋Œ์•„๊ฐ„๋‹ค.
    4. ๋„ค ๋ฐฉํ–ฅ ๋ชจ๋‘ ์ฒญ์†Œ๊ฐ€ ์ด๋ฏธ ๋˜์–ด์žˆ๊ฑฐ๋‚˜ ๋ฒฝ์ด๋ฉด์„œ, ๋’ค์ชฝ ๋ฐฉํ–ฅ์ด ๋ฒฝ์ด๋ผ ํ›„์ง„๋„ ํ•  ์ˆ˜ ์—†๋Š” ๊ฒฝ์šฐ์—๋Š” ์ž‘๋™์„ ๋ฉˆ์ถ˜๋‹ค.

๋กœ๋ด‡ ์ฒญ์†Œ๊ธฐ๋Š” ์ด๋ฏธ ์ฒญ์†Œ๋˜์–ด์žˆ๋Š” ์นธ์„ ๋˜ ์ฒญ์†Œํ•˜์ง€ ์•Š์œผ๋ฉฐ, ๋ฒฝ์„ ํ†ต๊ณผํ•  ์ˆ˜ ์—†๋‹ค.

์ž…๋ ฅ
์ฒซ์งธ ์ค„์— ์„ธ๋กœ ํฌ๊ธฐ N๊ณผ ๊ฐ€๋กœ ํฌ๊ธฐ M์ด ์ฃผ์–ด์ง„๋‹ค. (3 ≤ N, M ≤ 50)

๋‘˜์งธ ์ค„์— ๋กœ๋ด‡ ์ฒญ์†Œ๊ธฐ๊ฐ€ ์žˆ๋Š” ์นธ์˜ ์ขŒํ‘œ (r, c)์™€ ๋ฐ”๋ผ๋ณด๋Š” ๋ฐฉํ–ฅ d๊ฐ€ ์ฃผ์–ด์ง„๋‹ค. d๊ฐ€ 0์ธ ๊ฒฝ์šฐ์—๋Š” ๋ถ์ชฝ์„, 1์ธ ๊ฒฝ์šฐ์—๋Š” ๋™์ชฝ์„, 2์ธ ๊ฒฝ์šฐ์—๋Š” ๋‚จ์ชฝ์„, 3์ธ ๊ฒฝ์šฐ์—๋Š” ์„œ์ชฝ์„ ๋ฐ”๋ผ๋ณด๊ณ  ์žˆ๋Š” ๊ฒƒ์ด๋‹ค.

์…‹์งธ ์ค„๋ถ€ํ„ฐ N๊ฐœ์˜ ์ค„์— ์žฅ์†Œ์˜ ์ƒํƒœ๊ฐ€ ๋ถ์ชฝ๋ถ€ํ„ฐ ๋‚จ์ชฝ ์ˆœ์„œ๋Œ€๋กœ, ๊ฐ ์ค„์€ ์„œ์ชฝ๋ถ€ํ„ฐ ๋™์ชฝ ์ˆœ์„œ๋Œ€๋กœ ์ฃผ์–ด์ง„๋‹ค. ๋นˆ ์นธ์€ 0, ๋ฒฝ์€ 1๋กœ ์ฃผ์–ด์ง„๋‹ค. ์ง€๋„์˜ ์ฒซ ํ–‰, ๋งˆ์ง€๋ง‰ ํ–‰, ์ฒซ ์—ด, ๋งˆ์ง€๋ง‰ ์—ด์— ์žˆ๋Š” ๋ชจ๋“  ์นธ์€ ๋ฒฝ์ด๋‹ค.

๋กœ๋ด‡ ์ฒญ์†Œ๊ธฐ๊ฐ€ ์žˆ๋Š” ์นธ์˜ ์ƒํƒœ๋Š” ํ•ญ์ƒ ๋นˆ ์นธ์ด๋‹ค.

์ถœ๋ ฅ
๋กœ๋ด‡ ์ฒญ์†Œ๊ธฐ๊ฐ€ ์ฒญ์†Œํ•˜๋Š” ์นธ์˜ ๊ฐœ์ˆ˜๋ฅผ ์ถœ๋ ฅํ•œ๋‹ค.

์˜ˆ์ œ

3 3
1 1 0
1 1 1
1 0 1
1 1 1
answer : 1

ํ’€์ด

์‹œ๋ฎฌ๋ ˆ์ด์…˜ ๋ฌธ์ œ์ด๋‹ค.
๋กœ๋ด‡ ์ฒญ์†Œ๊ธฐ์˜ ์ž‘๋™ ๋ฐฉ๋ฒ•์„ ์ˆœ์„œ๋Œ€๋กœ ๊ตฌํ˜„ํ–ˆ๋‹ค.

//์™ผ์ชฝ ๋ฐฉํ–ฅ
const int ndx[] = { 0,-1,0,1 };
const int ndy[] = { -1,0,1,0 };

//ํ›„์ง„ ๋ฐฉํ–ฅ
const int bdx[] = { 1,0,-1,0 };
const int bdy[] = { 0,-1,0,1 };

์™ผ์ชฝ์œผ๋กœ ํšŒ์ „๊ณผ ํ›„์ง„ํ•˜๋Š” ๊ฒƒ์€ ๋ฐฐ์—ด์„ ๋งŒ๋“ค์–ด ๊ตฌํ˜„ํ–ˆ๋‹ค.
๊ทธ๋ฆฌ๊ณ  ํ˜„์žฌ ๋กœ๋ด‡์ฒญ์†Œ๊ธฐ์˜ ์œ„์น˜์™€ ๋ฐฉํ–ฅ์„ ์ €์žฅํ•  class๋ฅผ ์„ ์–ธํ•ด์„œ ์‚ฌ์šฉํ–ˆ๋‹ค.

visited ๋ฐฐ์—ด์„ ์ด์šฉํ•ด ํ•ด๋‹น ์œ„์น˜๋ฅผ ๋กœ๋ด‡์ฒญ์†Œ๊ธฐ๊ฐ€ ์ฒญ์†Œํ–ˆ์Œ์„ ์‹๋ณ„ํ–ˆ๋‹ค.
๊ทธ๋ฆฌ๊ณ  bfs๋ฅผ ์ด์šฉํ•ด ๋กœ๋ด‡์ฒญ์†Œ๊ธฐ๋ฅผ ๋Œ๋ ค์ฃผ์—ˆ๋‹ค.

4 ๋ฐฉํ–ฅ ๋ชจ๋‘ ์ฒญ์†Œํ•  ์ˆ˜ ์žˆ๋Š” ๊ณต๊ฐ„์ด ์—†๋‹ค๋ฉด ํ›„์ง„ํ•˜๊ฑฐ๋‚˜ ์ž‘๋™์„ ๊ทธ๋งŒ๋‘๋Š”๋ฐ ๊ทธ๊ฑด 4 ๋ฐฉํ–ฅ์„ ํ•˜๋‚˜ํ•˜๋‚˜ queue์— ๋„ฃ๋Š” ๊ฒŒ ์•„๋‹ˆ๋ผ ์ฒ˜์Œ๋ถ€ํ„ฐ ํŒ๋‹จํ•˜๋Š” ์‹์œผ๋กœ ๊ตฌํ˜„ํ–ˆ๋‹ค.

๋กœ๋ด‡์ฒญ์†Œ๊ธฐ๊ฐ€ ์™ผ์ชฝ์œผ๋กœ ํšŒ์ „ํ–ˆ์„ ๋•Œ์˜ ์ขŒํ‘œ์™€ ํ›„์ง„ํ–ˆ์„ ๋•Œ์˜ ์ขŒํ‘œ๋งŒ ์ž˜ ์ €์žฅํ•œ๋‹ค๋ฉด ๊ทธ๋ฆฌ ์–ด๋ ต์ง€ ์•Š๊ฒŒ ํ•ด๊ฒฐ ํ•  ์ˆ˜ ์žˆ๋Š” ๋ฌธ์ œ์ด๋‹ค.

์ฝ”๋“œ

//๋ถ ๋™ ๋‚จ ์„œ
const int dx[] = {-1,0,1,0};
const int dy[] = {0,1,0,-1};

//์™ผ์ชฝ ๋ฐฉํ–ฅ
const int ndx[] = { 0,-1,0,1 };
const int ndy[] = { -1,0,1,0 };

//ํ›„์ง„ ๋ฐฉํ–ฅ
const int bdx[] = { 1,0,-1,0 };
const int bdy[] = { 0,-1,0,1 };

class robot {
public:
    int x, y, d;
    robot(int x, int y, int d) {
        this->x = x;
        this->y = y;
        this->d = d;
    }
};

int main() {
    int n, m;
    cin >> n >> m;

    // ๋กœ๋ด‡์ฒญ์†Œ๊ธฐ์˜ ์นธ์˜ ์ขŒํ‘œ , ๋ฐ”๋ผ๋ณด๋Š” ๋ฐฉํ–ฅ
    int r, c, dd;
    cin >> r >> c >> dd;
    robot rb(r, c, dd);

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

    queue<robot> q;
    visited[r][c] = true;
    q.push(rb);

    bool chk = true;
    while (!q.empty()) {
        if (!chk) break;
        robot cur = q.front();
        q.pop();

        int cnt = 4;
        for (int dir = 0; dir < 4; dir++) {
            int nx = cur.x + dx[dir];
            int ny = cur.y + dy[dir];

            if (nx < 0 || nx >= n || ny < 0 || ny >= m) {
                cnt--;
                continue;
            }

            if (visited[nx][ny] || arr[nx][ny] == 1) cnt--;
        }
        if (cnt == 0) { // 4๋ฐฉํ–ฅ ๋ชจ๋‘ ์ ‘๊ทผ ๋ถˆ๊ฐ€๋Šฅ
            cur.x = cur.x + bdx[cur.d];
            cur.y = cur.y + bdy[cur.d];
            if (arr[cur.x][cur.y] == 1) { // ํ›„์ง„ ๋ถˆ๊ฐ€๋Šฅ
                chk = false;
                break;
            }
            q.push(cur);
            continue;
        }

        int nx = cur.x + ndx[cur.d];
        int ny = cur.y + ndy[cur.d];

        if (nx < 0 || nx >= n || ny < 0 || ny >= m) continue;

        // ์ฒญ์†Œ๊ฐ€ ๋˜์–ด ์žˆ์ง€ ์•Š๊ณ  ๋ฒฝ์ด ์•„๋‹๊ฒฝ์šฐ
        if (!visited[nx][ny] && arr[nx][ny] != 1) { // ์•„์ง ์ฒญ์†Œ๊ฐ€ ๋˜์–ด ์žˆ์ง€ ์•Š๋‹ค๋ฉด
            // ๊ทธ ๋ฐฉํ–ฅ์œผ๋กœ ํšŒ์ „
            if (cur.d == 0) cur.d = 3;
            else if (cur.d == 1) cur.d = 0;
            else if (cur.d == 2) cur.d = 1;
            else cur.d = 2;

            // ์ „์ง„ ํ›„ ์ฒญ์†Œ
            visited[nx][ny] = true;
            cur.x = nx;
            cur.y = ny;
            q.push(cur);
        }
        else { // ์ฒญ์†Œํ•  ๊ณต๊ฐ„์ด ์—†๋‹ค๋ฉด
            if (cur.d == 0) cur.d = 3;
            else if (cur.d == 1) cur.d = 0;
            else if (cur.d == 2) cur.d = 1;
            else cur.d = 2;
            q.push(cur);
        }
    }

    // ๋กœ๋ด‡์ฒญ์†Œ๊ธฐ๊ฐ€ ์ฒญ์†Œํ•œ ๊ตฌ์—ญ ์ˆ˜
    int cnt = 0;
    for (int i = 0; i < n; i++) {
        for (int j = 0; j < m; j++) {
            if (visited[i][j]) cnt++;
        }
    }
    cout << cnt;
}
๋ฐ˜์‘ํ˜•