[c++] BOJ 2589 :: ๋ณด๋ฌผ์„ฌ

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

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

 

๋ฌธ์ œ

๋ณด๋ฌผ์„ฌ ๋ฌธ์ œ ๋ฐ”๋กœ๊ฐ€๊ธฐ

๋ณด๋ฌผ์„ฌ ์ง€๋„๋ฅผ ๋ฐœ๊ฒฌํ•œ ํ›„ํฌ ์„ ์žฅ์€ ๋ณด๋ฌผ์„ ์ฐพ์•„๋‚˜์„ฐ๋‹ค. ๋ณด๋ฌผ์„ฌ ์ง€๋„๋Š” ์•„๋ž˜ ๊ทธ๋ฆผ๊ณผ ๊ฐ™์ด ์ง์‚ฌ๊ฐํ˜• ๋ชจ์–‘์ด๋ฉฐ ์—ฌ๋Ÿฌ ์นธ์œผ๋กœ ๋‚˜๋‰˜์–ด์ ธ ์žˆ๋‹ค. ๊ฐ ์นธ์€ ์œก์ง€(L)๋‚˜ ๋ฐ”๋‹ค(W)๋กœ ํ‘œ์‹œ๋˜์–ด ์žˆ๋‹ค. ์ด ์ง€๋„์—์„œ ์ด๋™์€ ์ƒํ•˜์ขŒ์šฐ๋กœ ์ด์›ƒํ•œ ์œก์ง€๋กœ๋งŒ ๊ฐ€๋Šฅํ•˜๋ฉฐ, ํ•œ ์นธ ์ด๋™ํ•˜๋Š”๋ฐ ํ•œ ์‹œ๊ฐ„์ด ๊ฑธ๋ฆฐ๋‹ค. ๋ณด๋ฌผ์€ ์„œ๋กœ ๊ฐ„์— ์ตœ๋‹จ ๊ฑฐ๋ฆฌ๋กœ ์ด๋™ํ•˜๋Š”๋ฐ ์žˆ์–ด ๊ฐ€์žฅ ๊ธด ์‹œ๊ฐ„์ด ๊ฑธ๋ฆฌ๋Š” ์œก์ง€ ๋‘ ๊ณณ์— ๋‚˜๋‰˜์–ด ๋ฌปํ˜€์žˆ๋‹ค. ์œก์ง€๋ฅผ ๋‚˜ํƒ€๋‚ด๋Š” ๋‘ ๊ณณ ์‚ฌ์ด๋ฅผ ์ตœ๋‹จ ๊ฑฐ๋ฆฌ๋กœ ์ด๋™ํ•˜๋ ค๋ฉด ๊ฐ™์€ ๊ณณ์„ ๋‘ ๋ฒˆ ์ด์ƒ ์ง€๋‚˜๊ฐ€๊ฑฐ๋‚˜, ๋ฉ€๋ฆฌ ๋Œ์•„๊ฐ€์„œ๋Š” ์•ˆ ๋œ๋‹ค.

 

img

 

์˜ˆ๋ฅผ ๋“ค์–ด ์œ„์™€ ๊ฐ™์ด ์ง€๋„๊ฐ€ ์ฃผ์–ด์กŒ๋‹ค๋ฉด ๋ณด๋ฌผ์€ ์•„๋ž˜ ํ‘œ์‹œ๋œ ๋‘ ๊ณณ์— ๋ฌปํ˜€ ์žˆ๊ฒŒ ๋˜๊ณ , ์ด ๋‘˜ ์‚ฌ์ด์˜ ์ตœ๋‹จ ๊ฑฐ๋ฆฌ๋กœ ์ด๋™ํ•˜๋Š” ์‹œ๊ฐ„์€ 8์‹œ๊ฐ„์ด ๋œ๋‹ค.

 

img

 

๋ณด๋ฌผ ์ง€๋„๊ฐ€ ์ฃผ์–ด์งˆ ๋•Œ, ๋ณด๋ฌผ์ด ๋ฌปํ˜€ ์žˆ๋Š” ๋‘ ๊ณณ ๊ฐ„์˜ ์ตœ๋‹จ ๊ฑฐ๋ฆฌ๋กœ ์ด๋™ํ•˜๋Š” ์‹œ๊ฐ„์„ ๊ตฌํ•˜๋Š” ํ”„๋กœ๊ทธ๋žจ์„ ์ž‘์„ฑํ•˜์‹œ์˜ค.

 

ํ’€์ด

  • ๊ฐ€์žฅ ๋จผ ๊ณณ์˜ ์ตœ๋‹จ๊ฑฐ๋ฆฌ๋ฅผ ๊ตฌํ•ด์•ผ ํ•œ๋‹ค.
  • ๋ชจ๋“  ์  => ๋ชจ๋“  ์  ๊ฑฐ๋ฆฌ๋ฅผ ๊ตฌํ•ด์•ผ ํ•œ๋‹ค.
    • ํ”Œ๋กœ์ด๋“œ ์™€์ƒฌ
    • ๋‹ค์ต์ŠคํŠธ๋ผ V๋ฒˆ
    • bfs V๋ฒˆ => ๊ฐ€์ค‘์น˜๊ฐ€ ์—†๊ณ  E๊ฐ€ ์ตœ๋Œ€ 4๊ฐœ ์ด๋ฏ€๋กœ bfs๋ฅผ ์‚ฌ์šฉํ•œ๋‹ค.

 

์ฝ”๋“œ

#include <iostream>
#include <string>
#include <queue>
#include <cstring>

using namespace std;

char map[51][51];
int direction[4][2] = { {0,1}, {1,0}, {0,-1}, {-1, 0} };
vector<pair<int,int>> LSpot;
int visited[51][51]; // visited๋Š” ๋งค๋ฒˆ ์ดˆ๊ธฐํ™”ํ•ด์„œ ์“ฐ๋ฉฐ ์ตœ๋‹จ๊ฑฐ๋ฆฌ ์ตœ๋Œ€๊ฐ’๋งŒ ์ €์žฅ
int result = -1;

int main() {
    // ์ž…๋ ฅ
    int L, W; cin >> L >> W;
    for (int i = 0; i < L; i++) { // map์— ์ €์žฅ

        string s; cin >> s;
        for (int j = 0; j < W; j++) {
            map[i][j] = s[j];
            if (map[i][j] == 'L')
                LSpot.push_back(make_pair(i, j));
        }
    }

    for (int i = 0; i < LSpot.size(); i++) {
        fill(&visited[0][0], &visited[50][50], -1); // -1๋กœ ์ดˆ๊ธฐํ™”
        queue<pair<int, int>> que;
        auto spot = LSpot[i];
        que.push(make_pair(spot.first, spot.second));
        visited[spot.first][spot.second] = 0;
        while (!que.empty()) {
            spot = que.front(); que.pop();
            int r = spot.first; int c = spot.second;
            int path = visited[spot.first][spot.second] + 1;
            for (int i = 0; i < 4; i++) {
                int rp = r + direction[i][0];
                int cp = c + direction[i][1];
                if (rp < 0 || cp < 0 || rp >= L || cp >= W) // ๋งต ๋ฐ–์— ์œ„์น˜
                    continue;
                if (visited[rp][cp] != -1) {
                    continue;
                }
                if (map[rp][cp] == 'L') {
                    visited[rp][cp] = path;
                    if (path > result)
                        result = path;
                    que.push(make_pair(rp, cp));
                }
            }
        }
    }

    cout << result;
}

 

๊ฒฐ๊ณผ

์•„์ด๋”” ๋ฉ”๋ชจ๋ฆฌ ์‹œ๊ฐ„ ์–ธ์–ด ์ฝ”๋“œ ๊ธธ์ด
gmldms784 2032 116 C++17 / ์ˆ˜์ • 1634

 

๋ฐ˜์‘ํ˜•