algorithm

BOJ 6087

rkawk 2024. 3. 20. 20:50

๋ฌธ์ œ

๋”๋ณด๊ธฐ

๋ ˆ์ด์ € ํ†ต์‹  ์„ฑ๊ณต๋‹ค๊ตญ์–ด

ํ•œ๊ตญ์–ด   

๋ฌธ์ œ

ํฌ๊ธฐ๊ฐ€ 1×1์ธ ์ •์‚ฌ๊ฐํ˜•์œผ๋กœ ๋‚˜๋ˆ„์–ด์ง„ W×H ํฌ๊ธฐ์˜ ์ง€๋„๊ฐ€ ์žˆ๋‹ค. ์ง€๋„์˜ ๊ฐ ์นธ์€ ๋นˆ ์นธ์ด๊ฑฐ๋‚˜ ๋ฒฝ์ด๋ฉฐ, ๋‘ ์นธ์€ 'C'๋กœ ํ‘œ์‹œ๋˜์–ด ์žˆ๋Š” ์นธ์ด๋‹ค.

'C'๋กœ ํ‘œ์‹œ๋˜์–ด ์žˆ๋Š” ๋‘ ์นธ์„ ๋ ˆ์ด์ €๋กœ ํ†ต์‹ ํ•˜๊ธฐ ์œ„ํ•ด์„œ ์„ค์น˜ํ•ด์•ผ ํ•˜๋Š” ๊ฑฐ์šธ ๊ฐœ์ˆ˜์˜ ์ตœ์†Ÿ๊ฐ’์„ ๊ตฌํ•˜๋Š” ํ”„๋กœ๊ทธ๋žจ์„ ์ž‘์„ฑํ•˜์‹œ์˜ค. ๋ ˆ์ด์ €๋กœ ํ†ต์‹ ํ•œ๋‹ค๋Š” ๊ฒƒ์€ ๋‘ ์นธ์„ ๋ ˆ์ด์ €๋กœ ์—ฐ๊ฒฐํ•  ์ˆ˜ ์žˆ์Œ์„ ์˜๋ฏธํ•œ๋‹ค.

๋ ˆ์ด์ €๋Š” C์—์„œ๋งŒ ๋ฐœ์‚ฌํ•  ์ˆ˜ ์žˆ๊ณ , ๋นˆ ์นธ์— ๊ฑฐ์šธ('/', '\')์„ ์„ค์น˜ํ•ด์„œ ๋ฐฉํ–ฅ์„ 90๋„ ํšŒ์ „์‹œํ‚ฌ ์ˆ˜ ์žˆ๋‹ค.

์•„๋ž˜ ๊ทธ๋ฆผ์€ H = 8, W = 7์ธ ๊ฒฝ์šฐ์ด๊ณ , ๋นˆ ์นธ์€ '.', ๋ฒฝ์€ '*'๋กœ ๋‚˜ํƒ€๋ƒˆ๋‹ค. ์™ผ์ชฝ์€ ์ดˆ๊ธฐ ์ƒํƒœ, ์˜ค๋ฅธ์ชฝ์€ ์ตœ์†Œ ๊ฐœ์ˆ˜์˜ ๊ฑฐ์šธ์„ ์‚ฌ์šฉํ•ด์„œ ๋‘ 'C'๋ฅผ ์—ฐ๊ฒฐํ•œ ๊ฒƒ์ด๋‹ค.

7 . . . . . . .         7 . . . . . . .
6 . . . . . . C         6 . . . . . /-C
5 . . . . . . *         5 . . . . . | *
4 * * * * * . *         4 * * * * * | *
3 . . . . * . .         3 . . . . * | .
2 . . . . * . .         2 . . . . * | .
1 . C . . * . .         1 . C . . * | .
0 . . . . . . .         0 . \-------/ .
  0 1 2 3 4 5 6           0 1 2 3 4 5 6

์ž…๋ ฅ

์ฒซ์งธ ์ค„์— W์™€ H๊ฐ€ ์ฃผ์–ด์ง„๋‹ค. (1 ≤ W, H ≤ 100)

๋‘˜์งธ ์ค„๋ถ€ํ„ฐ H๊ฐœ์˜ ์ค„์— ์ง€๋„๊ฐ€ ์ฃผ์–ด์ง„๋‹ค. ์ง€๋„์˜ ๊ฐ ๋ฌธ์ž๊ฐ€ ์˜๋ฏธํ•˜๋Š” ๊ฒƒ์€ ๋‹ค์Œ๊ณผ ๊ฐ™๋‹ค.

  • .: ๋นˆ ์นธ
  • *: ๋ฒฝ
  • C: ๋ ˆ์ด์ €๋กœ ์—ฐ๊ฒฐํ•ด์•ผ ํ•˜๋Š” ์นธ

'C'๋Š” ํ•ญ์ƒ ๋‘ ๊ฐœ์ด๊ณ , ๋ ˆ์ด์ €๋กœ ์—ฐ๊ฒฐํ•  ์ˆ˜ ์žˆ๋Š” ์ž…๋ ฅ๋งŒ ์ฃผ์–ด์ง„๋‹ค.

์ถœ๋ ฅ

์ฒซ์งธ ์ค„์— C๋ฅผ ์—ฐ๊ฒฐํ•˜๊ธฐ ์œ„ํ•ด ์„ค์น˜ํ•ด์•ผ ํ•˜๋Š” ๊ฑฐ์šธ ๊ฐœ์ˆ˜์˜ ์ตœ์†Ÿ๊ฐ’์„ ์ถœ๋ ฅํ•œ๋‹ค.

ํ’€์ด

๊ทผ๋ž˜ ํ‘ผ ๋ฌธ์ œ์ค‘์— ์ œ์ผ๋งŽ์ด ํ‹€๋ ธ๋‹ค. 

์ตœ์†Œ๊ฐœ์ˆ˜์˜ ๊ฑฐ์šธ ์„ ๊ตฌํ•˜๋Š” ๊ฒƒ์ด ๋ชฉํ‘œ์ด๊ณ  ์ถœ๋ฐœ์ง€์™€ ๋ชฉ์ ์ง€์— ํ•ด๋‹นํ•˜๋Š” ์ขŒํ‘œ๊ฐ€ ์ •ํ•ด์ ธ ์žˆ๊ธฐ ๋•Œ๋ฌธ์— ๊ฑฐ์šธ์˜ ๊ฐœ์ˆ˜๋ฅผ ๊ธฐ์ค€์œผ๋กœํ•œ BFS๋ฅผ ์‚ฌ์šฉํ•˜์—ฌ ๋ฌธ์ œ๋ฅผ ํ’€์—ˆ๋‹ค.

 

๊ฑฐ์šธ์˜ ๊ฐœ์ˆ˜๋ฅผ ๊ธฐ์ค€์œผ๋กœ ํ•˜๊ธฐ ๋•Œ๋ฌธ์— ๊ฐ€์ค‘์น˜๋Š” ํ•ญ์ƒ 0, 1์ด๋‹ค. ์ตœ๋‹จ๊ฑฐ๋ฆฌ์™€๋Š” ๊ด€๊ณ„๊ฐ€ ์—†์ด ๊ฑฐ์šธ์„ ๊ฐ€์žฅ ์ ๊ฒŒ ์‚ฌ์šฉํ•œ ๊ฒฝ๋กœ ๊ธฐ์ค€ ์ด๊ธฐ ๋•Œ๋ฌธ์— ๊ฐ๊ฐ์˜ ๊ฒฝ๋กœ ๋ถ€๋ถ„์— ๋ฐฉํ–ฅ์ •๋ณด๋ฅผ ๊ฐ™์ด ์ €์žฅํ•˜์—ฌ ๋ฐฉํ–ฅ์ด ๋ฐ”๋€Œ์—ˆ๋‹ค๋ฉด ๊ฑฐ์šธ์˜ ๊ฐœ์ˆ˜ + 1์„ ํ•ด์ฃผ๋„๋ก ํ•˜์˜€๋‹ค.

 

์ค‘๋ณต ๋ฐฉ๋ฌธ์— ๋Œ€ํ•ด์„œ๋„ ์ฒดํฌํ•ด์ฃผ์–ด์•ผ ํ•˜๋Š”๋ฐ ์žฌ๋ฐฉ๋ฌธ์‹œ์— ํ•ด๋‹น ๋…ธ๋“œ์— ํ‘œ์‹œ๋œ ๋ฐฉํ–ฅ์ •๋ณด, ๊ฑฐ์šธ์˜ ๊ฐœ์ˆ˜ ๊ฐ€ ๊ฐ™๋‹ค๋ฉด ๊ทธ ๋…ธ๋“œ๋Š” ๋‹ค์‹œ ๋ฐฉ๋ฌธํ•˜์ง€ ์•Š์•„๋„ ๋œ๋‹ค.

 

์ฝ”๋“œ

#include <iostream>
#include <queue>
#include <algorithm>
#include <string>
#include <deque>
#define INTMAX 987654321
using namespace std;
int W, H, dx[4]={1,0,-1,0}, dy[4]={0,1,0,-1}, ans[101][101], dirList[101][101][4];
// ํ•˜ -> 0, ์šฐ -> 1, ์ƒ -> 2, ์ขŒ -> 3
vector<pair<int,int > > C;
string board[101];
int main(){
    ios::sync_with_stdio(0);
    cin.tie(0);
    cin>>W>>H;
    for(int i=0; i<H; i++)
        cin>>board[i];
    for(int i=0; i<H; i++){
        for(int j=0; j<W; j++){
            if(board[i][j] == 'C'){
                C.push_back(make_pair(i,j));
            }
            ans[i][j] = INTMAX;
        }
    }
    ans[C[0].first][C[0].second] = 0;
    queue<pair<pair<int,int >,pair<int,int> > >q;
    for(int i=0; i<4; i++) {
        int nx = C[0].first+dx[i];
        int ny = C[0].second+dy[i];
        if(nx<0 || nx >= H || ny < 0 || ny >= W) continue;
        if(board[nx][ny] == '*') continue;
        ans[nx][ny] = 0;
        dirList[nx][ny][i] = 1;
        q.push(make_pair(make_pair(nx, ny), make_pair(i, 0)));
    }
    while(!q.empty()) {
        auto cur = q.front(); q.pop();
        for(int i=0; i<4; i++) {
            int nx = cur.first.first + dx[i];
            int ny = cur.first.second + dy[i];
            int tmp = cur.second.second;
            if(nx<0 || nx >= H || ny < 0 || ny >= W) continue;
            if(board[nx][ny] == '*') continue;
            if(i == cur.second.first && (i+2)%4 == cur.second.first) continue;
            if(i != cur.second.first) tmp += 1;
            if(ans[nx][ny] == tmp && dirList[nx][ny][i] == 1) continue;
            if(ans[nx][ny] >= tmp) {
                dirList[nx][ny][i] = 1;
                ans[nx][ny] = tmp;
                q.push(make_pair(make_pair(nx, ny), make_pair(i, tmp)));
            }
        }
    }
    cout<<ans[C[1].first][C[1].second];
}