# 17142. ์—ฐ๊ตฌ์†Œ 3
Study Repository

17142. ์—ฐ๊ตฌ์†Œ 3

by rlaehddnd0422

https://www.acmicpc.net/problem/17142

 

17142๋ฒˆ: ์—ฐ๊ตฌ์†Œ 3

์ธ์ฒด์— ์น˜๋ช…์ ์ธ ๋ฐ”์ด๋Ÿฌ์Šค๋ฅผ ์—ฐ๊ตฌํ•˜๋˜ ์—ฐ๊ตฌ์†Œ์— ์Šน์›์ด๊ฐ€ ์นจ์ž…ํ–ˆ๊ณ , ๋ฐ”์ด๋Ÿฌ์Šค๋ฅผ ์œ ์ถœํ•˜๋ ค๊ณ  ํ•œ๋‹ค. ๋ฐ”์ด๋Ÿฌ์Šค๋Š” ํ™œ์„ฑ ์ƒํƒœ์™€ ๋น„ํ™œ์„ฑ ์ƒํƒœ๊ฐ€ ์žˆ๋‹ค. ๊ฐ€์žฅ ์ฒ˜์Œ์— ๋ชจ๋“  ๋ฐ”์ด๋Ÿฌ์Šค๋Š” ๋น„ํ™œ์„ฑ ์ƒํƒœ์ด๊ณ 

www.acmicpc.net

 

 

Point

1. ์—ฐ๊ตฌ์†Œ 2์™€ ๋‹ฌ๋ฆฌ ๋น„ํ™œ์„ฑํ™” ๋ฐ”์ด๋Ÿฌ์Šค๊ฐ€ ์กด์žฌ.

2. ํ™œ์„ฑํ™” ๋ฐ”์ด๋Ÿฌ์Šค๊ฐ€ ๋น„ํ™œ์„ฑํ™” ๋ฐ”์ด๋Ÿฌ์Šค๊ฐ€ ์žˆ๋Š” ์นธ์œผ๋กœ ๊ฐ€๋ฉด ๋น„ํ™œ์„ฑํ™” ๋ฐ”์ด๋Ÿฌ์Šค๊ฐ€ ํ™œ์„ฑํ™” ๋ฐ”์ด๋Ÿฌ์Šค๋กœ ๋ฐ”๋€๋‹ค.

3. ํ™œ์„ฑํ™” ๋ฐ”์ด๋Ÿฌ์Šค๋ฅผ ์„ ํƒํ•˜๋Š” ๊ฒฝ์šฐ์˜ ์ˆ˜๋Š” ์ตœ๋Œ€ 10๊ฐœ์ค‘์—์„œ 5๊ฐœ ๊ณ ๋ฅด๋Š” ๊ฒฝ์šฐ๋กœ 10C5 = 252๊ฐ€์ง€ ๊ฒฝ์šฐ๊ฐ€ ์กด์žฌํ•œ๋‹ค.

4. ์ตœ๋Œ€ 10C5์— ๋Œ€ํ•ด BFS๋ฅผ ์‹คํ–‰ํ•˜๋ฉด O(252*50*50)=630,000 ์œผ๋กœ ์‹œ๊ฐ„ ์•ˆ์— ํ†ต๊ณผ ๊ฐ€๋Šฅ.

์ด ํ…Œ์ŠคํŠธ์ผ€์ด์Šค์˜ ๊ฒฝ์šฐ ์„ ํƒํ•  ์ˆ˜ ์žˆ๋Š” 2์˜ ๊ฒฝ์šฐ์˜ ์ˆ˜๋Š” ์ด 4๊ฐœ์ค‘์— 2๊ฐœ์ด๋‹ค. ๋”ฐ๋ผ์„œ ์ด 4C2 = 6๊ฐ€์ง€ ๊ฒฝ์šฐ์˜ ์ˆ˜๊ฐ€ ์กด์žฌํ•œ๋‹ค.

 

case 2

์œ„ ์ผ€์ด์Šค์˜ ๊ฒฝ์šฐ ๋‘ ๊ฐ€์ง€ ๊ฒฝ์šฐ๊ฐ€ ์กด์žฌํ•˜๋Š”๋ฐ ๋‘ ๋ฒˆ์งธ ๊ฒฝ์šฐ๋ฅผ ๋ณด๋ฉด ๋‹ต์ด 3์ด๋ผ๊ณ  ๊ธฐ๋Œ€ํ•  ์ˆ˜ ์žˆ๋Š”๋ฐ, ๋‹ต์€ 2์ด๋‹ค.

3์ด ๋“ค์–ด๊ฐ„ ์นธ์€ ๋น„ํ™œ์„ฑํ™” ๋ฐ”์ด๋Ÿฌ์Šค๊ฐ€ ์žˆ๋Š” ์นธ์œผ๋กœ  ์ตœ๋Œ€ ์‹œ๊ฐ„์„ ๊ณ„์‚ฐํ•  ๋•Œ์—๋Š” ๋น„ํ™œ์„ฑํ™” ๋ฐ”์ด๋Ÿฌ์Šค์นธ์„ ์‚ดํŽด๋ณด์ง€ ์•Š์•„๋„ ๋œ๋‹ค.

Why ? ๋ฌธ์ œ์—์„œ ๋ชจ๋“  ๋นˆ ์นธ์— ๋ฐ”์ด๋Ÿฌ์Šค๋ฅผ ํผ๋œจ๋ฆฌ๋Š” ์ตœ์†Œ ์‹œ๊ฐ„์„ ๊ตฌํ•˜๋ผ๊ณ  ํ–ˆ๊ธฐ ๋•Œ๋ฌธ์— ๋น„ํ™œ์„ฑํ™” ๋ฐ”์ด๋Ÿฌ์Šค ์นธ์€ ์‚ดํŽด๋ณด์ง€ ์•Š์•„๋„ ๋œ๋‹ค.

 

ํ•œ ๊ฐ€์ง€ ์ผ€์ด์Šค๋ฅผ ๋” ์‚ดํŽด๋ณด์ž.

 

case 3

์ด ์ผ€์ด์Šค์˜ ๊ฒฝ์šฐ๋„ ๋‘ ๊ฐ€์ง€ ๊ฒฝ์šฐ๊ฐ€ ์กด์žฌํ•œ๋‹ค

๋น„ํ™œ์„ฑํ™” ๋ฐ”์ด๋Ÿฌ์Šค์— ํ™œ์„ฑํ™” ๋ฐ”์ด๋Ÿฌ์Šค๊ฐ€ ๋‹ฟ๊ณ  ๋‚œ ๋’ค์—๋Š” ์–ด๋–ป๊ฒŒ ์ง„ํ–‰์„ ํ•ด์ฃผ์–ด์•ผ ํ• ๊นŒ?

์—ฐ๊ตฌ์†Œ 2 ๋ฌธ์ œ์™€ ๋งˆ์ฐฌ๊ฐ€์ง€๋กœ BFS๋ฅผ ์ง„ํ–‰ํ•  ๋•Œ์—๋Š” ๋น„ํ™œ์„ฑํ™” ๋ฐ”์ด๋Ÿฌ์Šค๊ฐ€ ์žˆ๋Š” ์นธ์„ ๋นˆ ์นธ์œผ๋กœ ์ทจ๊ธ‰ํ•ด์ฃผ๊ณ , 

์ตœ์†Œ ์‹œ๊ฐ„์„ ๊ณ„์‚ฐํ•  ๋•Œ์—๋Š” ๋น„ํ™œ์„ฑํ™” ๋ฐ”์ด๋Ÿฌ์Šค๊ฐ€ ์žˆ๋Š” ์นธ์„ ์‚ดํŽด๋ณด์ง€ ์•Š์œผ๋ฉด ๋œ๋‹ค. 

 

์—ฐ๊ตฌ์†Œ 2 ๋ฌธ์ œ์™€์˜ ์ฐจ์ด์ ์€ ๋‹จ์ง€ ๋น„ํ™œ์„ฑํ™” ๋ฐ”์ด๋Ÿฌ์Šค๊ฐ€ ์žˆ๋Š” ์นธ์„ ์‚ดํŽด๋ณด๋Š”์ง€์— ๋Œ€ํ•œ ์—ฌ๋ถ€.

 


์†Œ์Šค ์ฝ”๋“œ๋ฅผ ์‚ดํŽด๋ณด์ž.

#include <iostream>
#include <vector>
#include <algorithm>
#include <queue>
#include <utility>
#define FASTio ios_base :: sync_with_stdio(false), cin.tie(NULL), cout.tie(NULL)
#define endl '\n' 
using namespace std;
vector<vector<int>> area(51,vector<int>(51));
vector<pair<int,int>> virus;
int n, m;
int ans=-1;
int dy[]={-1,1,0,0};
int dx[]={0,0,1,-1};
int blank;

int bfs(queue<pair<int,int>> &q,vector<vector<bool>> check, vector<vector<int>> visited, vector<vector<bool>> &awake,int ans)
{   
    int result=-1;
    int cnt = 0;
    while(!q.empty())
    {   
        if(blank==cnt) 
        {
            break;
        }

        for(int i=0;i<q.size();i++)
        {
            int y = q.front().first;
            int x = q.front().second;
 
            for(int i=0;i<4;i++)
            {
                int ny = y+dy[i];
                int nx = x+dx[i];

                if(ny>=0 && nx>=0 && ny<n && nx<n)
                {
                    if(check[ny][nx]==false && area[ny][nx]!=1)
                    {   
                        if(area[ny][nx]==2 && awake[ny][nx]==false)
                        {
                            awake[ny][nx]=true;
                        }

                        if(area[ny][nx]==0) cnt++;

                        visited[ny][nx] = visited[y][x]+1;
                        check[ny][nx]=true;
                        q.push({ny,nx});
                    }
                }
            }
            
            q.pop();
        }    
    }


    if(blank==cnt)
    {
        for(int i=0;i<n;i++)
        {
            for(int j=0;j<n;j++)
            {   
                if(awake[i][j]==false)
                    result = max(result,visited[i][j]);
                if(area[i][j]==0 && check[i][j]==false)
                    return -1;
            }
        }
    }

    return result;
}

int main()
{
    FASTio;
    cin >> n >> m;

    for(int i=0;i<n;i++)
    {
        for(int j=0;j<n;j++)  
        {
            cin >> area[i][j];
            if(area[i][j]==2)
            {   
                virus.push_back({i,j});
            }
            else if(area[i][j]==0)
            {
                blank++;
            }

        }
    }

    // ์กฐํ•ฉ ์ดˆ๊ธฐ ์ž‘์—…
    vector<int> k(virus.size());
    for(int i=0;i<m;i++)
    {
        k[i] = 1;
    }

    for(int i=m;i<virus.size();i++)
    {
        k[i] = 0;
    }
    sort(k.begin(),k.end());

    // ์กฐํ•ฉ 
    do
    {   
        queue<pair<int,int>> q;
        vector<vector<int>> visited(51,vector<int>(51,0));
        vector<vector<bool>> check(51,vector<bool>(51,false));
        vector<vector<bool>> awake(51,vector<bool>(51,false));
        
        for(int i=0;i<virus.size();i++)
        {
            if(k[i]==1)
            {   
                int y,x;
                tie(y,x) = virus[i];
                q.push(make_pair(y,x));
                check[y][x]=true;
                awake[y][x]=true;
            }
        }

        int a = bfs(q,check,visited,awake,ans);
        if(a==-1) continue;
        else
        {
            if(ans==-1 || ans>a)
            {
                ans = a;
            }
        }

    } while (next_permutation(k.begin(),k.end()));
    
    cout << ans;

    return 0;
}

 

Main

1. ๋ฐฐ์—ด ์ž…๋ ฅ -> 2์ผ ๊ฒฝ์šฐ ์กฐํ•ฉ ์„ ํƒ์ง€์— ํฌํ•จ์‹œํ‚ค๊ธฐ ์œ„ํ•ด ๋ฒกํ„ฐ ํ‘ธ์‰ฌ, 0์ผ ๊ฒฝ์šฐ ๋นˆ์นธ์˜ ๊ฐœ์ˆ˜++

2. next_permutation์„ ์ด์šฉํ•œ ์กฐํ•ฉ์„ ์ด์šฉํ•˜๊ธฐ ์œ„ํ•œ ์ดˆ๊ธฐ์ž‘์—…

3. 2์˜ ์ด ๊ฐœ์ˆ˜ ์ค‘์— m๊ฐœ ์„ ํƒํ•˜๋Š” ๊ฐ ๊ฒฝ์šฐ์— ๋Œ€ํ•œ BFS

 

BFS

1. ํ˜„์žฌ ํ์—๋Š” ํ™œ์„ฑํ™” ๋œ ๋ฐ”์ด๋Ÿฌ์Šค m๊ฐœ๊ฐ€ ๋“ค์–ด์žˆ๋Š” ์ƒํ™ฉ

2. ์—ฐ๊ตฌ์†Œ 2์™€ ๋งˆ์ฐฌ๊ฐ€์ง€๋กœ ํ๋ฅผ ํ•œ๋ฒˆ ๋Œ๋ฉด์„œ BFS๋ฅผ ์ง„ํ–‰ํ•œ๋‹ค.

3. BFS๋ฅผ ์ง„ํ–‰ํ•˜๋Š” ๋„์ค‘ mainํ•จ์ˆ˜์—์„œ ๋นˆ์นธ์˜ ๊ฐœ์ˆ˜๋งŒํผ ๋‹ค ์ฑ„์šด ๊ฒฝ์šฐ ๋” ์‚ดํŽด๋ณผ ํ•„์š”๊ฐ€ ์—†์œผ๋ฏ€๋กœ BFS๋ฅผ ์ข…๋ฃŒํ•œ๋‹ค.

4. BFS๋ฅผ ์ง„ํ–‰ํ•˜๋Š” ๋„์ค‘ ๋น„ํ™œ์„ฑํ™” ๋ฐ”์ด๋Ÿฌ์Šค๋ฅผ ๋งŒ๋‚˜๋Š” ๊ฒฝ์šฐ ํ™œ์„ฑํ™” ์‹œ์ผœ์ค€๋‹ค.

5. ๊ทธ ์™ธ๋Š” ์—ฐ๊ตฌ์†Œ 2์™€ ๋™์ผํ•œ๋ฐ BFS๊ฐ€ ์ข…๋ฃŒ๋˜๊ณ  ๋ฐ”์ด๋Ÿฌ์Šค๊ฐ€ ํผ์ง€๋Š”๋ฐ ๊ฑธ๋ฆฐ ์‹œ๊ฐ„์„ ์‚ดํŽด๋ณผ ๋•Œ์— ๋น„ํ™œ์„ฑํ™” ๋ฐ”์ด๋Ÿฌ์Šค ์นธ์€ ์‚ดํŽด๋ณด์ง€ ์•Š๋Š”๋‹ค.

 

 

 

 ๋ถ„๋ช… ์‹œ๊ฐ„๋ณต์žก๋„๋ฅผ ๊ณ„์‚ฐํ–ˆ์„ ๋•Œ ํ†ต๊ณผ๋  ๊ฒƒ์ด๋ผ ์ƒ๊ฐํ–ˆ๋Š”๋ฐ ์•Œ๊ณ ๋ณด๋‹ˆ ๋‚ด๋ถ€์˜ ๋กœ์ง์— ๋ฌธ์ œ๊ฐ€ ์žˆ์—ˆ๋‹ค.

 

AC ์ฝ”๋“œ (BFS)

    while(!q.empty())
    {   
        if(blank==cnt) 
        {
            break;
        }

        for(int i=0;i<q.size();i++)
        {
            int y = q.front().first;
            int x = q.front().second;
 
            for(int i=0;i<4;i++)
            {
                int ny = y+dy[i];
                int nx = x+dx[i];

                if(ny>=0 && nx>=0 && ny<n && nx<n)
                {
                    if(check[ny][nx]==false && area[ny][nx]!=1)
                    {   
                        if(area[ny][nx]==2 && awake[ny][nx]==false)
                        {
                            awake[ny][nx]=true;
                        }

                        if(area[ny][nx]==0) cnt++;

                        visited[ny][nx] = visited[y][x]+1;
                        check[ny][nx]=true;
                        q.push({ny,nx});
                    }
                }
            }
            
            q.pop();
        }    
    }

 

์‹œ๊ฐ„์ดˆ๊ณผ ์ฝ”๋“œ (BFS)

    while(!q.empty())
    {   
        if(blank==cnt) 
        {
            break;
        }

        for(int i=0;i<q.size();i++)
        {
            int y = q.front().first;
            int x = q.front().second;
 
            for(int i=0;i<4;i++)
            {
                int ny = y+dy[i];
                int nx = x+dx[i];

                if(ny>=0 && nx>=0 && ny<n && nx<n)
                {
                    if(check[ny][nx]==false && area[ny][nx]!=1)
                    {   
                        if(area[ny][nx]==2 && awake[ny][nx]==false)
                        {
                            awake[ny][nx]=true;
                        }

                        if(area[ny][nx]==0) cnt++;

                        visited[ny][nx] = visited[y][x]+1;
                        check[ny][nx]=true;
                        q.push({ny,nx});
                    }
                }
            }     
        }    
        q.pop();
    }

 

q๋ฅผ popํ•˜๋Š” ์‹œ์ ์ด ์ƒํ•˜์ขŒ์šฐ๋ฅผ ์‚ดํ”ผ๊ณ  ํ‘ธ์‰ฌ๋ฅผ ํ•œ ์งํ›„ ๋ฐ”๋กœ ํŒ์„ ํ•ด์ฃผ์–ด์•ผ ํ•˜๋Š”๋ฐ q size๋งŒํผ for๋ฌธ์„ ๋Œ๋ฆฐ๋’ค์— ๋’ค๋Šฆ๊ฒŒ ํŒ์„ ํ•ด์ฃผ์–ด์„œ ์‹œ๊ฐ„์ดˆ๊ณผ๊ฐ€ ๋ฐœ์ƒํ–ˆ๋‹ค. ์ด๋ ‡๊ฒŒ ์‚ฌ์†Œํ•ด๋ณด์ด์ง€๋งŒ ์ค‘์š”ํ•œ ๋กœ์ง์€ ๋””๋ฒ„๊น…ํ•˜๊ธฐ ์–ด๋ ค์šฐ๋‹ˆ ๊ตฌํ˜„ํ• ๋•Œ์— ๋”์šฑ ์‹ ๊ฒฝ์จ์•ผ๊ฒ ๋‹ค.

๋ธ”๋กœ๊ทธ์˜ ์ •๋ณด

Study Repository

rlaehddnd0422

ํ™œ๋™ํ•˜๊ธฐ