Skip to content

Conversation

@flydongwoo
Copy link
Collaborator

@flydongwoo flydongwoo commented Sep 8, 2025

๐Ÿ”— ๋ฌธ์ œ ๋งํฌ

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

โœ”๏ธ ์†Œ์š”๋œ ์‹œ๊ฐ„

40๋ถ„

โœจ ์ˆ˜๋„ ์ฝ”๋“œ

24์ฃผ์ฐจ๋„ ์‹œ์ž‘ํ•ด๋ณด๋„๋ก ํ•˜๊ฒ ์Šต๋‹ˆ๋‹ค.
๋ณดํ†ต BFS๋Š” 2์ฐจ์› ๋ฐฐ์—ด๋กœ ํŠน์ • ์นธ์„ ๋ฐฉ๋ฌธํ–ˆ๋Š”์ง€ ์ฒดํฌํ•ด์•ผ ํ•˜์ง€๋งŒ, ์ด ๋ฌธ์ œ์—์„œ๋Š” ๊ทธ๋ ‡๊ฒŒ ํ•˜๋ฉด, ์–ด๋–ค ์นธ์— ๋ฒฝ์„ ์•ˆ ๋ถ€์ˆ˜๊ณ  ๋„์ฐฉํ•œ ๊ฒฝ์šฐ์™€ ๋ฒฝ์„ ๋ถ€์ˆ˜๊ณ  ๋„์ฐฉํ•œ ๊ฒฝ์šฐ๋ฅผ ๊ตฌ๋ถ„ํ•  ์ˆ˜ ์—†์Šต๋‹ˆ๋‹ค.
๊ทธ๋Ÿฌ๋ฏ€๋กœ, '๋ฒฝ์„ ์•ˆ ๋ถ€์ˆ˜๊ณ  ์˜จ ๊ฒฝ๋กœ'๋Š” ์•ž์œผ๋กœ ๋ฒฝ์„ ๋ถ€์ˆ  ๊ธฐํšŒ๊ฐ€ ๋‚จ์•„์žˆ๊ธฐ ๋•Œ๋ฌธ์— ๋” ์ค‘์š”ํ•  ์ˆ˜ ์žˆ๋Š”๋ฐ, ์ด ๊ธฐํšŒ๋ฅผ ๋ฌด์‹œํ•˜๊ฒŒ ๋˜๋Š”๊ฒ๋‹ˆ๋‹ค.

์ €๋Š” ์ด ๋ฌธ์ œ๋ฅผ ํ’€๊ธฐ ์œ„ํ•ด์„œ, ์„œ๋กœ ๋‹ค๋ฅธ ๋‘ ๊ฐœ์˜ ๋งต์ด ๊ฒน์ณ์ ธ์žˆ๋‹ค๊ณ  ์ƒ๊ฐํ–ˆ์Šต๋‹ˆ๋‹ค.

  • 0๋ฒˆ ๋งต: ์•„์ง ๋ฒฝ์„ ๋ถ€์ˆ  ๊ธฐํšŒ๊ฐ€ ๋‚จ์•„์žˆ๋Š” ํ”Œ๋ ˆ์ด์–ด๊ฐ€ ํƒํ—˜ํ•˜๋Š” ๋งต
  • 1๋ฒˆ ๋งต: ๋ฒฝ์„ ๋ถ€์ˆ  ๊ธฐํšŒ๋ฅผ ์ด๋ฏธ ์จ๋ฒ„๋ฆฐ ํ”Œ๋ ˆ์ด์–ด๊ฐ€ ํƒํ—˜ํ•˜๋Š” ๋งต

๊ทธ๋ฆฌ๊ณ  ์ด ๋‘ ๊ฐœ์˜ ๋งต์„ ๋™์‹œ์— ํƒํ—˜ํ•˜๋Š” ๊ฒƒ์ž…๋‹ˆ๋‹ค. 3์ฐจ์› ๋ฐฐ์—ด๋กœ ๋ง์ด์ฃ .

  • visited[r][c][0]: 0๋ฒˆ ๋งต์˜ (r, c)์นธ์„ ๋ฐฉ๋ฌธํ–ˆ๋Š”์ง€ ๊ธฐ๋ก
  • visited[r][c][1]: 1๋ฒˆ ๋งต์˜ (r, c)์นธ์„ ๋ฐฉ๋ฌธํ–ˆ๋Š”์ง€ ๊ธฐ๋ก

์ด๋Ÿฐ ์•„์ด๋””์–ด๋ฅผ ๊ฐ€์ง€๊ณ  ์ œ ์ฝ”๋“œ๋ฅผ ๋ณด์‹œ๋ฉด ์ดํ•ดํ•˜์‹ค ๊ฒƒ ์ž…๋‹ˆ๋‹ค!

#include <iostream>
#include <vector>
#include <queue>
#include <string>
#include <tuple>

using namespace std;

int N, M;
vector<string> board;
bool visited[1001][1001][2];

int dr[] = { -1, 1, 0, 0 };
int dc[] = { 0, 0, -1, 1 };

int bfs() {
    queue<tuple<int, int, int, bool>> q;

    q.push({ 0, 0, 1, false });
    visited[0][0][0] = true;

    while (!q.empty()) {
        auto [r, c, dist, broken] = q.front();
        q.pop();

        if (r == N - 1 && c == M - 1) {
            return dist;
        }

        for (int i = 0; i < 4; i++) {
            int nr = r + dr[i];
            int nc = c + dc[i];

            if (nr >= 0 && nr < N && nc >= 0 && nc < M) {
                if (board[nr][nc] == '0' && !visited[nr][nc][broken]) {
                    visited[nr][nc][broken] = true;
                    q.push({ nr, nc, dist + 1, broken });
                }
                else if (board[nr][nc] == '1' && !broken) {
                    visited[nr][nc][1] = true;
                    q.push({ nr, nc, dist + 1, true });
                }
            }
        }
    }

    return -1;
}

int main() {
    ios_base::sync_with_stdio(false);
    cin.tie(NULL);

    cin >> N >> M;
    board.resize(N);
    for (int i = 0; i < N; i++) {
        cin >> board[i];
    }

    cout << bfs() << endl;

    return 0;
}

์ €๋Š” ์ด ๋ฌธ์ œ๋ฅผ ํ’€๊ธฐ ์œ„ํ•ด์„œ tuple์„ ์‚ฌ์šฉํ–ˆ๋Š”๋ฐ์š”,

  • int r, int c: ํ˜„์žฌ ํƒํ—˜๊ฐ€์˜ ์œ„์น˜ (row, column)
  • int dist: ์‹œ์ž‘์ ๋ถ€ํ„ฐ ์—ฌ๊ธฐ๊นŒ์ง€ ์˜จ ๊ฑฐ๋ฆฌ
  • bool broken: ๋ฒฝ์„ ๋ถ€์‰ˆ๋Š”์ง€ ์—ฌ๋ถ€. false๋ฉด 0๋ฒˆ ๋งต, true๋ฉด 1๋ฒˆ ๋งต์— ์žˆ๋‹ค๋Š” ๋œป

ํƒํ—˜์„ ์‹œ์ž‘ํ•˜๋Š”๋ฐ, ์ฒ˜์Œ์—” ๋ฒฝ์„ ๋ถ€์ˆœ ์ ์ด ์—†์œผ๋‹ˆ 0๋ฒˆ ๋งต์—์„œ ์‹œ์ž‘ํ•ฉ๋‹ˆ๋‹ค. ๊ทธ๋ž˜์„œ visited[0][0][0]์— ๋ฐฉ๋ฌธํ–ˆ๋‹ค๊ณ  ๋„์žฅ์„ ์ฐ์Šต๋‹ˆ๋‹ค.

์ด์ œ, while ๋ฃจํ”„ ์•ˆ์—์„œ ๋‘ ๊ฐ€์ง€ ์ด๋™ ๊ทœ์น™์ด ์žˆ๋Š”๋ฐ

  1. ๋นˆ ๊ณต๊ฐ„('0')์œผ๋กœ ์ด๋™ํ•  ๋•Œ
  • ๊ฐ€๋ ค๋Š” ๊ณณ์ด ๋นˆ ๊ณต๊ฐ„์ด๋ฉด, ๊ทธ๋ƒฅ ์ง€๊ธˆ ์žˆ๋Š” ๋งต์—์„œ ๊ทธ๋Œ€๋กœ ์ด๋™ํ•ฉ๋‹ˆ๋‹ค.
  • ๋งŒ์•ฝ ๋‚ด๊ฐ€ 0๋ฒˆ ๋งต์— ์žˆ์—ˆ๋‹ค๋ฉด(broken์ด false), ๋‹ค์Œ ์นธ๋„ 0๋ฒˆ ๋งต์œผ๋กœ ๊ฐ‘๋‹ˆ๋‹ค. ๊ทธ๋ž˜์„œ visited ๋ฐฐ์—ด๋„ [broken] ์ธ๋ฑ์Šค๋ฅผ ๊ทธ๋Œ€๋กœ ์‚ฌ์šฉํ•ด์„œ ์ฒดํฌํ•ฉ๋‹ˆ๋‹ค.
  1. ๋ฒฝ('1')์œผ๋กœ ์ด๋™ํ•  ๋•Œ
  • ๋ฒฝ์„ ๋ถ€์ˆ˜๋Š” ๊ฑด ์˜ค์ง 0๋ฒˆ ๋งต์— ์žˆ์„ ๋•Œ๋งŒ ๊ฐ€๋Šฅํ•ฉ๋‹ˆ๋‹ค.
  • ๋ฒฝ์„ ๋ถ€์ˆ˜๋Š” ์ˆœ๊ฐ„, ํƒํ—˜๊ฐ€๋Š” 0๋ฒˆ ๋งต์—์„œ 1๋ฒˆ ๋งต์œผ๋กœ ์ฐจ์›์„ ์ด๋™ํ•œ๋‹ค๊ณ  ์ƒ๊ฐํ•˜๋ฉด ๋ฉ๋‹ˆ๋‹ค.
  • ๊ทธ๋ž˜์„œ ๋ฐฉ๋ฌธ ๊ธฐ๋ก์€ 1๋ฒˆ ๋งต์— ํ•ด๋‹นํ•˜๋Š” visited[nr][nc][1]์— ๋‚จ๊ธฐ๊ณ , ํ์— ์ƒˆ๋กœ์šด ํƒํ—˜ ์ •๋ณด๋ฅผ ๋„ฃ์„ ๋•Œ๋„ broken ์ƒํƒœ๋ฅผ true๋กœ ๋ฐ”๊ฟ”์ฃผ๋Š”๊ฒ๋‹ˆ๋‹ค.

์ด ๊ณผ์ •์„ ๋ชฉ์ ์ง€์— ๋„์ฐฉํ•  ๋•Œ๊นŒ์ง€ ๋ฐ˜๋ณตํ•˜๋Š” ๊ฒ๋‹ˆ๋‹ค.

๐Ÿ“š ์ƒˆ๋กญ๊ฒŒ ์•Œ๊ฒŒ๋œ ๋‚ด์šฉ

3์ฐจ์› ๋ฐฐ์—ด์„ ์‚ฌ์šฉํ•˜๋Š” ๊ฒฝ์šฐ๊ฐ€ ์žˆ๋‹ค๋Š” ๊ฒƒ์„ ์•Œ๊ฒŒ ๋˜์—ˆ๊ณ , tuple์„ ์‚ฌ์šฉํ•˜๋ฉด ์ฝ”๋“œ๊ฐ€ ๊ฐ„ํŽธํ•ด์ง€๊ณ  ํŽธํ•ด์ง„๋‹ค๋Š” ๊ฒƒ์„ ์•Œ๊ฒŒ ๋˜์—ˆ์Œ!

@mj010504
Copy link
Collaborator

mj010504 commented Sep 9, 2025

์ €๋Š” tuple ๋Œ€์‹  ์ œ๊ฐ€ ์ž์ฃผ ์‚ฌ์šฉํ•˜๋Š” ๊ตฌ์กฐ์ฒด๋ฅผ ์‚ฌ์šฉํ–ˆ์Šต๋‹ˆ๋‹ค! ์ถ”๊ฐ€์ ์ธ ์ƒํƒœ๊ฐ€ ํ•„์š”ํ•œ BFS ๋ฌธ์ œ๋ผ์„œ ์ข‹์€ ์—ฐ์Šต์ด ๋œ ๊ฒƒ ๊ฐ™์Šต๋‹ˆ๋‹ค.
์ˆ˜๊ณ ํ•˜์…จ์Šต๋‹ˆ๋‹ค!

#include<bits/stdc++.h>
using namespace std;

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

bool visited[1001][1001][2];

struct p {
    int x, y, cnt;
    bool crashed;
};

int main() {

    freopen("input.txt", "rt", stdin);
    ios_base::sync_with_stdio(false);
    cout.tie(0);
    cin.tie(0);

    int n, m; cin >> n >> m;
    vector<vector<int>> v(n, vector<int> (m));
    for(int i = 0; i < n; i++) {
        string a; cin >> a;
        for(int j = 0; j < m; j++) {
            int temp = a[j] - '0';
            v[i][j] = temp;
        }
    }

    int res = -1;
    queue<p> q; 
    q.push({0, 0, 1, false});
    visited[0][0][0] = true;

    while(!q.empty()) {
        auto tp = q.front(); q.pop();

        if(tp.x == n-1 && tp.y == m-1) {
            res = tp.cnt;
            break;
        }

        for(int d = 0; d < 4; d++) {
            int xx = tp.x + dx[d];
            int yy = tp.y + dy[d];

            if(xx >= 0 && xx < n && yy >= 0 && yy < m) {
                if(v[xx][yy] == 0 && !visited[xx][yy][tp.crashed]) {
                    visited[xx][yy][tp.crashed] = true;
                    q.push({xx, yy, tp.cnt + 1, tp.crashed});
                }

                 if(v[xx][yy] == 1 && !tp.crashed) {
                    visited[xx][yy][1] = true;
                    q.push({xx, yy, tp.cnt + 1, true});
                }
            }
        }
    }

    cout << res;
}

Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment

Projects

None yet

Development

Successfully merging this pull request may close these issues.

3 participants