algorithm

๋ฐฑ์ค€ 2151

rkawk 2024. 6. 18. 22:24

๋ฌธ์ œ

๋”๋ณด๊ธฐ

์ฑ„์˜์ด๋Š” ๊ฑฐ์šธ์„ ๋“ค์—ฌ๋‹ค๋ณด๋Š” ๊ฒƒ์„ ์ฐธ ์ข‹์•„ํ•œ๋‹ค. ๊ทธ๋ž˜์„œ ์ง‘ ๊ณณ๊ณณ์— ๊ฑฐ์šธ์„ ์„ค์น˜ํ•ด๋‘๊ณ  ์ง‘ ์•ˆ์„ ๋Œ์•„๋‹ค๋‹ ๋•Œ๋งˆ๋‹ค ๊ฑฐ์šธ์„ ๋ณด๊ณค ํ•œ๋‹ค.

์ฑ„์˜์ด๋Š” ์ƒˆ ํ•ด๋ฅผ ๋งž์ดํ•˜์—ฌ ์ด์‚ฌ๋ฅผ ํ•˜๊ฒŒ ๋˜์—ˆ๋Š”๋ฐ, ๊ฑฐ์šธ์„ ์ข‹์•„ํ•˜๋Š” ๊ทธ๋…€์˜ ์„ฑ๊ฒฉ ๋•Œ๋ฌธ์— ์ƒˆ ์ง‘์—๋„ ๊ฑฐ์šธ์„ ๋งค๋‹ฌ๋งŒํ•œ ์œ„์น˜๊ฐ€ ์—ฌ๋Ÿฌ ๊ณณ ์žˆ๋‹ค. ๋˜ํ•œ ์ฑ„์˜์ด๋„ค ์ƒˆ ์ง‘์—๋Š” ๋ฌธ์ด ๋‘ ๊ฐœ ์žˆ๋Š”๋ฐ, ์ฑ„์˜์ด๋Š” ๊ฑฐ์šธ์„ ์ž˜ ์„ค์น˜ํ•˜์—ฌ ์žฅ๋‚œ์„ ์น˜๊ณ  ์‹ถ์–ด์กŒ๋‹ค. ์ฆ‰, ํ•œ ์ชฝ ๋ฌธ์—์„œ ๋‹ค๋ฅธ ์ชฝ ๋ฌธ์„ ๋ณผ ์ˆ˜ ์žˆ๋„๋ก ๊ฑฐ์šธ์„ ์„ค์น˜ํ•˜๊ณ  ์‹ถ์–ด์กŒ๋‹ค.

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

๊ฑฐ์šธ์„ ์„ค์น˜ํ•  ๋•Œ์—๋Š” 45๋„ ๊ธฐ์šธ์–ด์ง„ ๋Œ€๊ฐ์„  ๋ฐฉํ–ฅ์œผ๋กœ ์„ค์น˜ํ•ด์•ผ ํ•œ๋‹ค. ๋˜ํ•œ ๋ชจ๋“  ๊ฑฐ์šธ์€ ์–‘๋ฉด ๊ฑฐ์šธ์ด๊ธฐ ๋•Œ๋ฌธ์— ์–‘ ์ชฝ ๋ชจ๋‘์—์„œ ๋ฐ˜์‚ฌ๊ฐ€ ์ผ์–ด๋‚  ์ˆ˜ ์žˆ๋‹ค. ์ฑ„์˜์ด๋Š” ๊ฑฐ์šธ์„ ๋งค์šฐ ๋งŽ์ด ๊ฐ€์ง€๊ณ  ์žˆ์–ด์„œ ๊ฑฐ์šธ์ด ๋ถ€์กฑํ•œ ๊ฒฝ์šฐ๋Š” ์—†๋‹ค๊ณ  ํ•˜์ž.

๊ฑฐ์šธ์„ ์–ด๋–ป๊ฒŒ ์„ค์น˜ํ•ด๋„ ํ•œ ์ชฝ ๋ฌธ์—์„œ ๋‹ค๋ฅธ ์ชฝ ๋ฌธ์„ ๋ณผ ์ˆ˜ ์—†๋Š” ๊ฒฝ์šฐ๋Š” ์ฃผ์–ด์ง€์ง€ ์•Š๋Š”๋‹ค.

 

 

์ฒซ์งธ ์ค„์— ์ง‘์˜ ํฌ๊ธฐ N (2 ≤ N ≤ 50)์ด ์ฃผ์–ด์ง„๋‹ค. ๋‹ค์Œ N๊ฐœ์˜ ์ค„์—๋Š” N๊ฐœ์˜ ๋ฌธ์ž๋กœ ์ง‘์— ๋Œ€ํ•œ ์ •๋ณด๊ฐ€ ์ฃผ์–ด์ง„๋‹ค. ‘#’๋Š” ๋ฌธ์ด ์„ค์น˜๋œ ๊ณณ์œผ๋กœ ํ•ญ์ƒ ๋‘ ๊ณณ์ด๋ฉฐ, ‘.’์€ ์•„๋ฌด ๊ฒƒ๋„ ์—†๋Š” ๊ฒƒ์œผ๋กœ ๋น›์€ ์ด ๊ณณ์„ ํ†ต๊ณผํ•œ๋‹ค. ‘!’์€ ๊ฑฐ์šธ์„ ์„ค์น˜ํ•  ์ˆ˜ ์žˆ๋Š” ์œ„์น˜๋ฅผ ๋‚˜ํƒ€๋‚ด๊ณ , ‘*’์€ ๋น›์ด ํ†ต๊ณผํ•  ์ˆ˜ ์—†๋Š” ๋ฒฝ์„ ๋‚˜ํƒ€๋‚ธ๋‹ค.

ํ’€์ด

๋‹ค์ต์ŠคํŠธ๋ผ๋กœ ํ’€์—ˆ๋‹ค.

๋‹ค์Œ๊ณผ ๊ฐ™์€ ์˜ˆ์ œ๊ฐ€ ์žˆ์„๋•Œ ์ฒซ๋ฒˆ์งธ ๋ฌธ๋ถ€ํ„ฐ ์‹œ์ž‘ํ•˜๋ฉด

๋‹ค์Œ๊ณผ ๊ฐ™์€ ๋ฐฉํ–ฅ์œผ๋กœ ๊ฐˆ ์ˆ˜ ์žˆ๊ณ , ๊ฑฐ์šธ์„ ์ง€๋‚˜์ง€ ์•Š์•˜๊ธฐ ๋•Œ๋ฌธ์— ์‚ฌ์šฉํ•œ ๊ฑฐ์šธ์˜ ๊ฐœ์ˆ˜๋ฅผ 0์œผ๋กœ ์ฒดํฌํ•œ๋‹ค.

๋‹ค์Œ ์ง„ํ–‰๋ฐฉํ–ฅ์€ ํ˜„์žฌ ์ง€์ ์ด ๊ฑฐ์šธ์ด ์•„๋‹ˆ์—ˆ๊ธฐ ๋•Œ๋ฌธ์— ๋ฐฉํ–ฅ์„ ๋ฐ”๊ฟ€ ์ˆ˜ ์—†๊ณ , ๊ทธ๋Œ€๋กœ ์ง„ํ–‰ํ•ด์„œ ํ•ด๋‹น ๊ฑฐ์šธ๋กœ ๊ฐ€๊ฒŒ๋œ๋‹ค.

๊ทธ ๋‹ค์Œ ์ง„ํ–‰๋ฐฉํ–ฅ์€ ์ด๋ ‡๊ฒŒ ๋˜๋ฉฐ,  ํ˜„์žฌ ์ง€์ ์ด ๊ฑฐ์šธ์ด๊ธฐ ๋•Œ๋ฌธ์— ์‚ฌ์šฉํ•œ ๊ฑฐ์šธ + 1์„ ํ•˜์—ฌ ๋‹ค์Œ ์ง€์ ์œผ๋กœ ์ด๋™ํ•œ๋‹ค.

 

์ด๋Ÿฌํ•œ ๋ฐฉ์‹์œผ๋กœ [์ง€์ ][๋ฐฉํ–ฅ]์— ๋Œ€ํ•œ ์ตœ์†Œ ๊ฑฐ์šธ์˜ ์‚ฌ์šฉ๊ฐœ์ˆ˜๋ฅผ ์ฒดํฌํ•œ๋‹ค๋ฉด ๋ฌธ์ œ๋ฅผ ํ’€ ์ˆ˜ ์žˆ๋‹ค.

 

ํ˜„์žฌ ์ง€์ ์˜ ๊ฒฝ์šฐ์˜ ์ˆ˜๋Š” 3๊ฐ€์ง€๋กœ, {#, ., !} ์˜ ๊ฒฝ์šฐ์˜ ์ˆ˜๊ฐ€ ์žˆ๋‹ค.

#์ธ ๊ฒฝ์šฐ์—๋Š” ๋ฐฉํ–ฅ์˜ ์ œํ•œ์ด ์—†๊ณ 

.์ธ ๊ฒฝ์šฐ์—๋Š” ์ด์ „์— ์ง„ํ–‰ํ–ˆ๋˜ ๋ฐฉํ–ฅ๋Œ€๋กœ ์ง„ํ–‰ํ•ด์•ผํ•˜๋ฉฐ

!์ธ ๊ฒฝ์šฐ์—๋Š” ์ด์ „์— ์ง„ํ–‰ํ–ˆ๋˜ ๋ฐฉํ–ฅ์˜ ๋ฐ˜๋Œ€๋ฐฉํ–ฅ์„ ์ œ์™ธํ•˜๊ณ  ์ด๋™ํ•  ์ˆ˜ ์žˆ๋‹ค๊ณ  ๊ฐ€์ •ํ–ˆ๋‹ค.

 

์ฝ”๋“œ

#include <iostream>
#include <algorithm>
#include <queue>
#include <string>
using namespace std;
int N, dx[4]={0,1,0,-1}, dy[4]={1,0,-1,0}, ans[51][51][4], ansNum = 987654322, startX, startY;
string board[51];
void solve(int x, int y) {
    queue<pair< pair<int, int>, pair<int, int> > >q;
    q.push(make_pair(make_pair(x, y), make_pair(-1, 0)));
    while(!q.empty()) {
        auto cur = q.front().first; int curDir = q.front().second.first; int curDist = q.front().second.second; q.pop();
        char curBoard = board[cur.first][cur.second];
        if(curBoard == '#') {
            for(int dir=0; dir<4; dir++) {
                int nx = cur.first + dx[dir];
                int ny = cur.second + dy[dir];
                if(nx<0||nx>=N||ny<0||ny>=N||board[nx][ny] == '*') continue;
                if(ans[nx][ny][dir] > curDist) {
                    ans[nx][ny][dir] = curDist;
                    q.push(make_pair(make_pair(nx,ny), make_pair(dir, curDist)));
                }
                if(board[nx][ny] == '#'&& (nx != startX || ny != startY)) ansNum = min(ansNum, ans[nx][ny][dir]);
            }
        }else if(curBoard == '!') {
            for(int dir=0; dir<4; dir++) {
                if(dir == (curDir+2)%4) continue;
                int nx = cur.first + dx[dir];
                int ny = cur.second + dy[dir];
                if(nx<0||nx>=N||ny<0||ny>=N||board[nx][ny] == '*') continue;
                int addiDist = (curDir == dir)?0:1;
                if(ans[nx][ny][dir] > curDist + addiDist) {
                    ans[nx][ny][dir] = curDist + addiDist;
                    q.push(make_pair(make_pair(nx,ny), make_pair(dir, curDist + addiDist)));
                }
                if(board[nx][ny] == '#' && (nx != startX || ny != startY)) ansNum = min(ansNum, ans[nx][ny][dir]);
            }
        }else if(curBoard == '.') {
            int nx = cur.first + dx[curDir];
            int ny = cur.second + dy[curDir];
            if(nx<0||nx>=N||ny<0||ny>=N||board[nx][ny] == '*') continue;
            if(ans[nx][ny][curDir] > curDist) {
                ans[nx][ny][curDir] = curDist;
                q.push(make_pair(make_pair(nx,ny), make_pair(curDir, curDist)));
            }
            if(board[nx][ny] == '#'&& (nx != startX || ny != startY)) ansNum = min(ansNum, ans[nx][ny][curDir]);
        }
    }
}
int main(){
    cin>>N;
    for(int i=0; i<N; i++) cin>>board[i];
    for(int i=0; i<N; i++)
        for(int j=0; j<N; j++){
            if(board[i][j] == '#'){
                startX = i; startY = j;
            }
            for(int k=0; k<4; k++)
                ans[i][j][k] = 987654321;
        }
    for(int i=0; i<4; i++)
        ans[startX][startY][i] = 0;
    solve(startX, startY);
    cout<<ansNum;
    

}

'algorithm' ์นดํ…Œ๊ณ ๋ฆฌ์˜ ๋‹ค๋ฅธ ๊ธ€

๋ฐฑ์ค€ 31846  (0) 2024.06.24
๋ฐฑ์ค€ 31845  (0) 2024.06.21
๋ฐฑ์ค€ 28325  (0) 2024.06.13
๋ฐฑ์ค€ 1987  (1) 2024.06.12
Codeforces Round 938 (Div. 3)  (0) 2024.05.02