๐Ÿ•๏ธ PS (BOJ)/BFS and DFS

[BOJ][C++] ๋ฐฑ์ค€ 3197๋ฒˆ: ๋ฐฑ์กฐ์˜ ํ˜ธ์ˆ˜ (Platinum V)

์„ ๋‹ฌ 2025. 5. 8. 01:47
๋ฐ˜์‘ํ˜•

๋ฌธ์ œ

๋‘ ๋งˆ๋ฆฌ์˜ ๋ฐฑ์กฐ๊ฐ€ ํ˜ธ์ˆ˜์—์„œ ์‚ด๊ณ  ์žˆ์—ˆ๋‹ค. ๊ทธ๋ ‡์ง€๋งŒ ๋‘ ๋งˆ๋ฆฌ๋Š” ํ˜ธ์ˆ˜๋ฅผ ๋ฎ๊ณ  ์žˆ๋Š” ๋น™ํŒ์œผ๋กœ ๋งŒ๋‚˜์ง€ ๋ชปํ•œ๋‹ค.
ํ˜ธ์ˆ˜๋Š” ํ–‰์ด R๊ฐœ, ์—ด์ด C๊ฐœ์ธ ์ง์‚ฌ๊ฐํ˜• ๋ชจ์–‘์ด๋‹ค. ์–ด๋–ค ์นธ์€ ์–ผ์Œ์œผ๋กœ ๋ฎ์—ฌ์žˆ๋‹ค.
ํ˜ธ์ˆ˜๋Š” ์ฐจ๋ก€๋กœ ๋…น๋Š”๋ฐ, ๋งค์ผ ๋ฌผ ๊ณต๊ฐ„๊ณผ ์ ‘์ด‰ํ•œ ๋ชจ๋“  ๋น™ํŒ ๊ณต๊ฐ„์€ ๋…น๋Š”๋‹ค. ๋‘ ๊ฐœ์˜ ๊ณต๊ฐ„์ด ์ ‘์ด‰ํ•˜๋ ค๋ฉด ๊ฐ€๋กœ๋‚˜ ์„ธ๋กœ๋กœ ๋‹ฟ์•„ ์žˆ๋Š” ๊ฒƒ๋งŒ (๋Œ€๊ฐ์„ ์€ ๊ณ ๋ คํ•˜์ง€ ์•Š๋Š”๋‹ค) ์ƒ๊ฐํ•œ๋‹ค.
์•„๋ž˜์—๋Š” ์„ธ ๊ฐ€์ง€ ์˜ˆ๊ฐ€ ์žˆ๋‹ค.
๋ฐฑ์กฐ๋Š” ์˜ค์ง ๋ฌผ ๊ณต๊ฐ„์—์„œ ์„ธ๋กœ๋‚˜ ๊ฐ€๋กœ๋กœ๋งŒ(๋Œ€๊ฐ์„ ์€ ์ œ์™ธํ•œ๋‹ค) ์›€์ง์ผ ์ˆ˜ ์žˆ๋‹ค.
๋ฉฐ์น ์ด ์ง€๋‚˜์•ผ ๋ฐฑ์กฐ๋“ค์ด ๋งŒ๋‚  ์ˆ˜ ์žˆ๋Š” ์ง€ ๊ณ„์‚ฐํ•˜๋Š” ํ”„๋กœ๊ทธ๋žจ์„ ์ž‘์„ฑํ•˜์‹œ์˜ค.

์ž…๋ ฅ

์ž…๋ ฅ์˜ ์ฒซ์งธ ์ค„์—๋Š” R๊ณผ C๊ฐ€ ์ฃผ์–ด์ง„๋‹ค. ๋‹จ, 1 ≤ R, C ≤ 1500.
๋‹ค์Œ R๊ฐœ์˜ ์ค„์—๋Š” ๊ฐ๊ฐ ๊ธธ์ด C์˜ ๋ฌธ์ž์—ด์ด ํ•˜๋‚˜์”ฉ ์ฃผ์–ด์ง„๋‹ค. '.'์€ ๋ฌผ ๊ณต๊ฐ„, 'X'๋Š” ๋น™ํŒ ๊ณต๊ฐ„, 'L'์€ ๋ฐฑ์กฐ๊ฐ€ ์žˆ๋Š” ๊ณต๊ฐ„์œผ๋กœ ๋‚˜ํƒ€๋‚ธ๋‹ค.

์ถœ๋ ฅ

์ฒซ์งธ ์ค„์— ๋ฌธ์ œ์—์„œ ์ฃผ์–ด์ง„ ๊ฑธ๋ฆฌ๋Š” ๋‚ ์„ ์ถœ๋ ฅํ•œ๋‹ค.

 

ํ’€์ด

"๋ฐฑ์กฐ BFS -> ๋ฌผ BFS"

์ด ๊ณผ์ •์„ ๋ฐ˜๋ณตํ•˜๋ฉด ๋˜๋Š” ๋ฌธ์ œ

 

๋งค์ผ BFS๋ฅผ ๋‘๋ฒˆ์”ฉ ํ•ด์•ผํ•œ๋‹ค.

์ด๋•Œ bfs ์‹œ์ž‘์ ์„ ๋งค๋ฒˆ ์ด์ค‘ ๋ฐ˜๋ณต๋ฌธ์œผ๋กœ ๊ตฌํ•˜๋ คํ•˜๋ฉด ๋ฐ”๋กœ 2%์—์„œ ์‹œ๊ฐ„์ดˆ๊ณผ๊ฐ€ ๋œฌ๋‹ค.

bfs๋ฅผ ํ•  ๋•Œ ๋‚ด์ผ์˜ ์‹œ์ž‘์ ์ด ๋  ํ›„๋ณด๋“ค์„ ๋ฏธ๋ฆฌ ํ์— ๋„ฃ์–ด๋‘๊ณ , ๊ทธ ๋‹ค์Œ๋‚  ์ด ํ๋ฅผ ์‚ฌ์šฉํ•ด์•ผํ•œ๋‹ค

 

1. ๋ฌผ BFS : melt()

// bfs : ๋น™ํŒ(X) -> ๋ฌผ(.)
void melt() {
    queue<ci>q = water; // ํ์— ์ €์žฅ๋œ ๋ฌผ์˜ ์ขŒํ‘œ๋“ค์—์„œ bfs ์‹œ์ž‘
    while(!water.empty()) { // ๋‹ค์Œ ๋ฌผ ์ขŒํ‘œ๋“ค์€ ์ดˆ๊ธฐํ™”
        water.pop();
    }

    while(!q.empty()) {
        ci cur = q.front();
        q.pop();
        
        for(int dir=0; dir<4; dir++) {
            int x = cur.first + dx[dir];
            int y = cur.second + dy[dir];
            
            if(x<0 || x>=r || y<0 || y>=c) continue;
            
            // ๋น™ํŒ์ด๋ผ๋ฉด ๋ฌผ๋กœ ๋ฐ”๊พธ๊ณ  ํ•ด๋‹น ์œ„์น˜ ์ €์žฅ (๋‚ด์ผ ๋ฌผ์ด ๋จ)
            if(v[x][y] == 'X') {
                v[x][y] = '.';
                water.push({x,y});
            }
            // ๋น™ํŒ์ด ์•„๋‹ˆ๋ผ๋ฉด(๋ฌผ์ด๋‚˜ ๋ฐฑ์กฐ๋ผ๋ฉด) ํŒจ์Šค
        }
    }
    return;
}

 

2. ๋ฐฑ์กฐ BFS : swim()

 

// bfs : ๋ฌผ(.) or ๋น™ํŒ(X) -> ๋ฐฑ์กฐ(L)
bool swim() {
    vector<vector<bool>>visited(r, vector<bool>(c, false)); // ๋ฐฉ๋ฌธ์—ฌ๋ถ€ ํ‘œ์‹œ

    queue<ci>q = swan; // ํ์— ์ €์žฅ๋œ ๋ฐฑ์กฐ ์œ„์น˜์—์„œ bfs ์‹œ์ž‘
    while(!swan.empty()) { // ๋‹ค์Œ ํ ์ดˆ๊ธฐํ™”
        swan.pop();
    }

    while(!q.empty()) {
        ci cur = q.front();
        q.pop();
        
        for(int dir=0; dir<4; dir++) {
            int x = cur.first + dx[dir];
            int y = cur.second + dy[dir];
            
            if(x<0 || x>=r || y<0 || y>=c) continue;
            if(visited[x][y]) continue;
            
            visited[x][y] = true;
            
            if(goal.first==x && goal.second==y) {
            // ๋‹ค์Œ ์ขŒํ‘œ๊ฐ€ ๋‹ค๋ฅธ ๋ฐฑ์กฐ์˜ ์œ„์น˜์™€ ๊ฐ™์Œ = ๋ฐฑ์กฐ ๋‘๋งˆ๋ฆฌ๊ฐ€ ๋งŒ๋‚จ
                return true;
            } else if(v[x][y] == '.') { 
            // ๋‹ค์Œ ์ขŒํ‘œ๊ฐ€ ๋ฌผ = ๋ฐฑ์กฐ๊ฐ€ ์ฐจ์ง€ํ•จ
                v[x][y] = 'L';
                q.push({x,y});
            } else if(v[x][y] == 'X') { 
            // ๋‹ค์Œ ์ขŒํ‘œ๊ฐ€ ๋น™ํŒ = ๋” ๋ชป๋‚˜์•„๊ฐ = ๋‚ด์ผ ํ˜„์žฌ ์œ„์น˜๋ถ€ํ„ฐ ์‹œ์ž‘ํ•˜๋„๋ก ์ขŒํ‘œ ์ €์žฅ
                swan.push({cur.first, cur.second});
            }
        }
    }
    return false;
}

 

 

์ฝ”๋“œ

// ํ’€์ด : https://whkakrkr.tistory.com

#include <bits/stdc++.h>

using namespace std;

typedef pair<int, int> ci;

int dx[] = {0,0,-1,1};
int dy[] = {-1,1,0,0};
	    
int r,c;
vector<string> v;

ci start={-1,-1}, goal;
queue<ci> water, swan;

// bfs : ๋ฌผ(.) or ๋น™ํŒ(X) -> ๋ฐฑ์กฐ(L)
bool swim() {
    vector<vector<bool>>visited(r, vector<bool>(c, false));

    queue<ci>q = swan;
    while(!swan.empty()) {
        swan.pop();
    }

    while(!q.empty()) {
        ci cur = q.front();
        q.pop();
        
        for(int dir=0; dir<4; dir++) {
            int x = cur.first + dx[dir];
            int y = cur.second + dy[dir];
            
            if(x<0 || x>=r || y<0 || y>=c) continue;
            if(visited[x][y]) continue;
            
            visited[x][y] = true;
            
            if(goal.first==x && goal.second==y) { // ๋ฐฑ์กฐ ๋‘๋งˆ๋ฆฌ๊ฐ€ ๋งŒ๋‚จ
                return true;
            } else if(v[x][y] == '.') { // ๋ฌผ๋กœ ์ด๋™
                v[x][y] = 'L';
                q.push({x,y});
            } else if(v[x][y] == 'X') { // ๋ฌผ์ด ๋  ์šด๋ช…
                swan.push({cur.first, cur.second});
            }
        }
    }
    return false;
}

// bfs : ๋น™ํŒ(X) -> ๋ฌผ(.)
void melt() {
    queue<ci>q = water;
    while(!water.empty()) {
        water.pop();
    }

    while(!q.empty()) {
        ci cur = q.front();
        q.pop();
        
        for(int dir=0; dir<4; dir++) {
            int x = cur.first + dx[dir];
            int y = cur.second + dy[dir];
            
            if(x<0 || x>=r || y<0 || y>=c) continue;
            if(v[x][y] == 'X') {
                v[x][y] = '.';
                water.push({x,y});
            }
        }
    }
    return;
}


int main() {
    ios_base::sync_with_stdio(false);
	cout.tie(NULL);
	cin.tie(NULL);
	
	// ์ž…๋ ฅ
	cin >> r >> c;
	v.assign(r, "");
	for(int i=0; i<r; i++) {
	    cin >> v[i];

	    for(int j=0; j<c; j++) {
	        if(v[i][j] != 'X') {
	            water.push({i,j});
	        }
	        if(v[i][j] == 'L') {
	            if(start.first==-1 && start.second==-1) {
	                start = {i,j};
	                swan.push({i,j});
	            } else {
	                goal = {i,j};
	            }
	        }
	    }
	}

	// ํ’€์ด
	int time = 0;
	while(true) {
	    if(swim()) {
	        break;
	    }
	    melt();
	    time++;
	}
	
	// ์ถœ๋ ฅ
	cout << time;
	
    return 0;
}

 

melt ํ•จ์ˆ˜๋ฅผ ๋จผ์ € ์ดํ•ดํ•˜๊ณ  swim ํ•จ์ˆ˜๋ฅผ ์ดํ•ดํ•˜๋Š”๊ฒŒ ๋‚˜์„๊ฒƒ์ด๋‹ค

๋ฐ˜์‘ํ˜•