백준(boj)3184 - 양

업데이트:

문제 링크 - https://www.acmicpc.net/problem/3184

👀문제이해 및 풀이방법

기본적인 bfs문제이다. 처음에 양이나 늑대의 위치를 저장해두고 그곳만 탐색해볼까 했지만 들이는 메모리 낭비에비해 줄어드는 시간복잡도가 작다고 생각해서 모든 곳을 시작위치의 후보로 두었다

visit 배열을 통해 늑대나 양인 곳에서만 출발하고 또 이미 갔던곳은 안가도록 하였다

bfs를 돌때마다 양과 늑대의 수를 비교해서 더 작은 것을 전체 양,늑대 수에서 빼주면 금방 답이 나온다

📝코드

#include <iostream>
#include <vector>
#include <queue>
using namespace std;
int dx[4]={1,0,-1,0};
int dy[4]={0,1,0,-1};
class yang{
private:
    vector<vector<char>> map;
    int R,C;
    vector<vector<bool>> visit;
    int S=0,W=0;
public:
    yang(){
        std::cin >> R >>C;
        map.resize(R,vector<char>(C));
        visit.resize(R,vector<bool>(C,false));
        set_val();
    }
    void set_val(){
        for(int i=0;i<R;i++){
            for(int j=0;j<C;j++){
                std::cin >> map[i][j];
                if(map[i][j]=='v')
                    W++;
                else if(map[i][j]=='o')
                    S++;
            }
        }
    }
    void bfs(int x,int y){
        queue<pair<int,int>> q;
        q.push({x,y});
        visit[x][y]=true;
        pair<int,int> cur;
        int nx,ny;
        int o_cnt=0,v_cnt=0;
        while(!q.empty()){
            cur = q.front();
            q.pop();
            if(map[cur.first][cur.second]=='v')
                v_cnt++;
            else if(map[cur.first][cur.second]=='o')
                o_cnt++;

            for(int i=0;i<4;i++){
                nx=cur.first+dx[i],ny=cur.second+dy[i];
                if(nx>=0 && nx<R && ny>=0 && ny<C){
                    if(!visit[nx][ny] && map[nx][ny]!='#'){
                        visit[nx][ny]=true;
                        q.push({nx,ny});
                    }
                }
            }
        }
        if(o_cnt>v_cnt)
            W-=v_cnt;
        else
            S-=o_cnt;
    }
    void find_sol(){
        for(int i=0;i<R;i++){
            for(int j=0;j<C;j++){
                if(!visit[i][j] && (map[i][j]=='v' || map[i][j]=='o'))
                    bfs(i,j);
            }
        }
        std::cout << S <<' '<< W <<'\n';
    }

};
int main(){
    yang yg;
    yg.find_sol();

    return 0;
}

image

댓글남기기