본문 바로가기
기타/백준일지

[프로그래머스] BFS - 388353번 지게차와 크레인

by 민지기il 2025. 5. 25.
#include <bits/stdc++.h>
#define fastio cin.tie(0)->sync_with_stdio(0)
using namespace std;

bool visited[51][51];

void gCar(char target, vector<string> &storage, int n, int m){
    int dx[4]={-1,1,0,0};
    int dy[4]={0,0,1,-1};
    vector<pair<int,int>> delPoint;
    //초기화
    for(int idx=0; idx<n; idx++)
        fill(visited[idx], visited[idx]+m, false);
    for(int i=0; i<n; i++)
    {
        for(int j=0; j<m; j++)
        {
            if(i!=0 && i!=n-1 && j!=0 && j!=m-1) continue; // 경계가 아닌 경우는 무시
            if(storage[i][j]==target) delPoint.push_back(make_pair(i,j)); //삭제 대상에 추가
            else if (storage[i][j]==' '){ //BFS 시작
                queue<pair<int,int>> q;
                q.push(make_pair(i,j));
                visited[i][j]=true;
                
                while(!q.empty()){ //인접한 target 검색
                    pair<int,int> xy = q.front();
                    q.pop();
                    
                    int x=xy.first; int y=xy.second;
                    for(int dir=0; dir<4; dir++){
                        int nx = x+dx[dir], ny=y+dy[dir];
                        if(nx<0 || nx>=n || ny<0 || ny>=m) continue;
                        if(storage[nx][ny]==target && !visited[nx][ny]){
                            delPoint.push_back(make_pair(nx,ny)); // 삭제 대상에 추가
                            visited[nx][ny]=true;
                        }
                        if(storage[nx][ny]==' '&&!visited[nx][ny]){
                            q.push(make_pair(nx,ny)); //빈곳이면 계속 탐색, 재귀적 연결
                            visited[nx][ny] = true;
                        }
                    }
                }
            }
        }
    }
    for(pair<int,int> point: delPoint){
        storage[point.first][point.second]=' ';
    }
}


void crain(char target, vector<string> &storage, int n, int m){
    for(int i=0; i<n; i++){
        for(int j=0; j<m; j++){
            if(storage[i][j]==target) storage[i][j]=' ';
        }
    }
}

int solution(vector<string> storage, vector<string> requests) {
    int answer = 0;
    int n=storage.size();
    int m=storage[0].size();
    for(string cmd : requests)
    {
        if(cmd.size()==1)
            gCar(cmd[0], storage, n, m);
        else crain(cmd[0], storage, n, m);
    }
    for(int i=0; i<n; i++){
        for(int j=0; j<m; j++)
            if(storage[i][j] != ' ') answer++;
    }
    
    return answer;
}

참고: https://59travel.tistory.com/114