๋ณธ๋ฌธ ๋ฐ”๋กœ๊ฐ€๊ธฐ

๐“ก๐“ธ๐“ธ๐“ถ๐Ÿฃ: ๐’œ๐“๐‘”๐‘œ๐“‡๐’พ๐“‰๐’ฝ๐“‚/์•Œ๊ณ ๋ฆฌ์ฆ˜ ๋ฌธ์ œ ํ’€์ด

BOJ3184 : ์–‘ (Silver 1)

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

์˜ค๋žœ๋งŒ์— ๋Œ์•„์˜จ PS~~~^~^

์—ฌ๋Ÿฌ๋ถ„ ํ˜น์‹œ ํ•œ ๋ฒˆ์— ๋งž์€ ๊ธฐ๋ถ„์ด ์–ด๋–ค์ง€ ์•„์‹œ๋‚˜์š”

์ผ๋‹จ ์ €๋Š” ์••๋‹ˆ๋‹ค

ใ…Žํžˆํžˆใ…ฃํžˆํžˆ 

์ง€๊ธˆ ๋‹น์—ฐํžˆ ๋ญํ•˜๋‚˜ ์˜ˆ์™ธ ์žˆ๊ฒ ์ง€ ํ•˜๊ณ  ๋ƒ…๋‹ค ๋Œ๋ ค๋ดค๋Š”๋ฐ ๊ฐ‘์ž๊ธฐ 100% ๋œจ๊ณ  ๋งž์•˜์Šต๋‹ˆ๋‹ค ๋– ์„œ ์†Œ๋ฆฌ์ง€๋ฅผ๋ป”ํ•จ

 

์ •๋ง ์˜ค๋žœ๋งŒ์— ๋ฐฑ์ค€ ๋‹ค์‹œ ํ’€๊ณ  ์žˆ๋Š”๋ฐ ์–ด์งธ์„œ์ธ์ง€ ํ•œ์ฐธ ๊ณต๋ถ€ํ•  ๋•Œ๋ณด๋‹ค ๋จธ๋ฆฌ๊ฐ€ ๋” ํŒฝํŒฝ ์ž˜ ๋Œ์•„๊ฐ€์œ ,,,

์˜›๋‚ ์—” ์‹ค๋ฒ„ 1 ์ด๋ ‡๊ฒŒ ๋นจ๋ฆฌ ๋ชป ํ’€์—ˆ์—ˆ๋Š”๋ฐ...

 

๊ทธ๋Ÿผ ์„ค๋ช…์„ ํ•ด๋ณด๊ฒ ์Šต๋‹ˆ๋‹น

 

 

 

1. ์šฐ์„  ๊ธฐํ˜ธ๋ฅผ ์ „๋ถ€ ์ˆซ์ž๋กœ ๋ฐ”๊ฟ” ์ด์ฐจ์› ๋ฐฐ์—ด map์— ์ €์žฅํ•ด์ค€๋‹ค

 

๋ณด์ž๋งˆ์ž ์™œ์ธ์ง€ ๊ธฐํ˜ธ ๊ทธ๋Œ€๋กœ ๋ƒ…๋‘๋ฉด ๋‚ด๊ฐ€ ๋„ˆ๋ฌด ํ—ท๊ฐˆ๋ฆด ๊ฒƒ ๊ฐ™์•„์„œ ๊ทธ๋ƒฅ ์‹น ๋‹ค ์ˆซ์ž๋กœ ๋ณ€ํ˜•ํ•ด์„œ ์ €์žฅํ•ด์ฃผ์—ˆ์Šต๋‹ˆ๋‹ค

์‚ฌ์‹ค ๋ญ ์‹คํ–‰ ์†๋„์— ์—„์ฒญ ํฐ ์ œ์•ฝ์ด ์žˆ๋Š” ๊ทธ๋Ÿฐ ๋ฌธ์ œ์˜€์œผ๋ฉด ๊ตณ์ด ์•ˆํ•˜๋Š”๊ฒŒ ๋” ์ด๋“์ผ ๊ฒƒ ๊ฐ™๊ธฐ๋„ ํ•œ๋ฐ,, ๊ทธ๋ƒฅ ๋‚˜๋Š” ์ด๋ ‡๊ฒŒ ํ•ด์”€

์•ˆํ•ด๋„ ๋˜๊ธด ํ•  ๊ฒƒ ๊ฐ™์Šต๋‹ˆ๋‹ค์šฉ

 

2. count๋ผ๋Š” ํ•จ์ˆ˜๋ฅผ ํ˜ธ์ถœํ•ด์ค€๋‹ค

์ด ๋•Œ, ๊ฑ finalnum (์ตœ์ข… ๊ฒฐ๊ณผ๊ฐ’) ์ด๋ผ๋Š” 2์ฐจ์› ๋ฐฐ์—ด์„ ๋งŒ๋“ค์–ด์„œ ํฌ์ธํ„ฐ๋กœ ๋ฐ›์•„, ํ•จ์ˆ˜ ์•ˆ์—์„œ ๋ฐฐ์—ด์— ์ง์ ‘ ์ ‘๊ทผํ•˜๋„๋ก ํ•˜์˜€๋‹ค. finalnum[0] = sheep num, finalnum[1] = wolf num

return ๊ฐ’์ด ๋‘ ๊ฐœ์—ฌ์•ผ ํ•˜๋Š” ๊ฒƒ์„ ์ƒ๊ฐํ•˜๊ธฐ ๊ท€์ฐฎ์•˜๊ธฐ ๋•Œ๋ฌธ ใ…Ž

 

count ํ•จ์ˆ˜์˜ ์‹คํ–‰์ด ์ข…๋ฃŒ๋˜๋ฉด finalnum ๋ฐฐ์—ด์— ์ตœ์ข… ์–‘์˜ ์ˆ˜์™€ ๋Š‘๋Œ€์˜ ์ˆ˜๊ฐ€ ์—…๋ฐ์ดํŠธ ๋˜์–ด์žˆ์œผ๋ฏ€๋กœ ์ด๊ฑธ ๊ทธ๋Œ€๋กœ ์ถœ๋ ฅํ•ด์ค€๋‹ค.

 

 

3. count ํ•จ์ˆ˜

 

์ขŒํ‘œ (0,0)๋ถ€ํ„ฐ (R-1, C-1)๊นŒ์ง€ ํ•˜๋‚˜์”ฉ ์‹œ์ž‘์ ์„ ์žก์•„ dfs๋ฅผ ๋ˆ๋‹ค

์ด ๋•Œ, ์™œ ์ด๋ ‡๊ฒŒ ํ–ˆ๋ƒ๋ฉด, ์šธํƒ€๋ฆฌ๋กœ ๋ง‰ํ˜€์žˆ๋Š” ํ•œ ์˜์—ญ์„ ๋‹ค ๋Œ๋ฉด DFS๊ฐ€ ๋๋‚˜๋„๋ก ์„ค๊ณ„ํ–ˆ๊ธฐ ๋•Œ๋ฌธ์—, ๋˜ ๋‹ค๋ฅธ ์˜์—ญ์˜ ์‹œ์ž‘์ ์ด ์–ด๋””์ผ ์ง€ ๋ชจ๋ฅด๊ธฐ ๋•Œ๋ฌธ! ๋‹จ, ์ด๋ฏธ ๋ณธ ์˜์—ญ์„ ๋‹ค์‹œ ๋ณด์ง€ ์•Š๊ธฐ ์œ„ํ•ด check ๊ฐ’์ด 0์ผ ๋•Œ๋งŒ ๋Œ๋„๋ก ํ•œ๋‹ค.

 

main ๊ณผ ๋งˆ์ฐฌ๊ฐ€์ง€๋กœ sheepwolf๋ผ๋Š” 2์ฐจ์› ๋ฐฐ์—ด์„ ๋งŒ๋“ค์–ด, ์ด ๋ฐฐ์—ด์— ํ•ด๋‹น ์˜์—ญ์— ์žˆ์—ˆ๋˜ ์–‘์˜ ์ˆ˜์™€ ๋Š‘๋Œ€์˜ ์ˆ˜๊ฐ€ ์ €์žฅ๋œ๋‹ค.

๋งŒ์•ฝ ์–ด๋–ค ์˜์—ญ์— ๋Š‘๋Œ€๋ณด๋‹ค ์–‘์ด ๋งŽ๋‹ค๋ฉด, ๊ทธ ์–‘์˜ ์ˆ˜๋งŒํผ finalnum[0] ์„ ์ฆ๊ฐ€์‹œ์ผœ์ฃผ๊ณ , ๋Š‘๋Œ€์˜ ์ˆ˜๋Š” ์ฆ๊ฐ€์‹œํ‚ค์ง€ ์•Š๋Š”๋‹ค

๋ฐ˜๋Œ€๋กœ ๋Š‘๋Œ€๊ฐ€ ์–‘๋ณด๋‹ค ๋งŽ๊ฑฐ๋‚˜ ๊ฐ™๋‹ค๋ฉด, ๊ทธ ๋Š‘๋Œ€์˜ ์ˆ˜๋งŒํผ finalnum[1]์„ ์ฆ๊ฐ€์‹œ์ผœ ์ค€๋‹ค

 

์ด๋Ÿฐ์‹์œผ๋กœ map ์ „์ฒด๋ฅผ ํ•œ ๋ฐ”ํ€ด ๋‹ค ๋ˆ ๋‹ค์Œ์— ํ•จ์ˆ˜ ๋!

์•„ ์ฐธ, dfs ํ•œ ๋ฒˆ ๋๋‚˜๋ฉด sheepwolf ๋ฐฐ์—ด ์ดˆ๊ธฐํ™” ํ•ด์ฃผ๋Š”๊ฑฐ ์žŠ์ง€ ๋ง๊ธฐ~~ (์‹ค์ œ๋กœ ์•ˆํ–ˆ๋‹ค๊ฐ€ ๊ดด์ƒํ•œ ๊ฒฐ๊ณผ๋ฅผ ๋ด„)

 

 

4. DFS ํ•จ์ˆ˜

 

๊ธฐ๋ณธ์ ์ธ dfs ํ•จ์ˆ˜์ด๋‹ค

์ผ๋‹จ ๋ฐฉ๋ฌธ ํ–ˆ๋˜ ์ขŒํ‘œ์ด๊ฑฐ๋‚˜, ์šธํƒ€๋ฆฌ๋ฉด return ํ•ด์„œ ๋’ค๋กœ backํ•ด์ฃผ๊ณ 

์•„๋‹ˆ๋ผ๋ฉด ๋ฐฉ๋ฌธ ํ–ˆ๋‹ค๋Š” ํ‘œ์‹œ ํ•ด์ฃผ๊ธฐ~ check[x][y] = 1 ํ•ด์ฃผ๊ธฐ~

 

๊ทธ๋ฆฌ๊ณ  ์ง€๊ธˆ ์žˆ๋Š” ์ขŒํ‘œ๊ฐ€ ์–‘์ด๋ฉด ์–‘ ์ˆ˜ ์ฆ๊ฐ€, ๋Š‘๋Œ€๋ฉด ๋Š‘๋Œ€ ์ˆ˜ ์ฆ๊ฐ€ ํ•ด์ฃผ๊ณ 

 

๊ทธ๋ฆฌ๊ณ  ๋‚˜์„œ ์ด์ œ ์ƒํ•˜์ขŒ์šฐ๋กœ ์ด๋™ํ•ด๋ณธ๋‹ค

์ด ๋•Œ, ๋ฒ”์œ„ ๋ฒ—์–ด๋‚˜์ง€ ์•Š๊ฒŒ ํ•ด์ฃผ๊ธฐ!

 

์˜์—ญ์„ ์„ธ๋Š” ๋ฌธ์ œ์˜ ๊ฒฝ์šฐ ์šฐ์ธก, ์•„๋ž˜๋กœ๋งŒ ๊ฐ€๋Š”๊ฒŒ ์•„๋‹ˆ๋ผ ๋ฌด์กฐ๊ฑด ์œ„๋ž‘ ์ขŒ์ธก๋„ ํƒ์ƒ‰ํ•ด๋ด์•ผํ•œ๋‹ค

์–ด๋””๊ฐ€ ๋šซ๋ ค์žˆ์„์ง€ ๋ชจ๋ฅด๊ฒŒ ๋•Œ๋ฌด๋„ค 

ํ•œ ๋ฒˆ ๋Œ ๋•Œ ์˜์—ญ ์ „์ฒด๋ฅผ ๋‹ค ๋Œ์•„์•ผ ๋จธ๋ฆฌ ์•„ํ”ˆ ์ผ์„ ๋ง‰์„ ์ˆ˜ ์žˆ๋‹ค

 

๊ทธ๋ž˜์„œ ๊ฒฐ๋ก ์ ์œผ๋กœ DFS๋ฅผ ํ•œ ๋ฒˆ ๋Œ ๋•Œ๋งˆ๋‹ค, ์šธํƒ€๋ฆฌ ์•ˆ์— ์žˆ๋Š” ์˜์—ญ  ํ•˜๋‚˜๋ฅผ ์ „๋ถ€ ๋Œ๊ณ , ๊ทธ ์˜์—ญ์„ check ํ‘œ์‹œ ํ•ด์ค€ ๋‹ค์Œ, ์–‘์˜ ์ˆ˜์™€ ๋Š‘๋Œ€์˜ ์ˆ˜๋ฅผ ์„ธ์„œ count ํ•จ์ˆ˜๋กœ ์ „๋‹ฌํ•ด์ค€๋‹ค.

 

 

#include <stdio.h>
#include <iostream>
#include <string.h>

using namespace std;

#define MAX 250
#define MIN 3


int map[MAX][MAX] = {0,};
int check[MAX][MAX] = {0,};
int R, C =0;

void count(int* finalnum);
void DFS(int x, int y, int* sheepwolf);

/*
. = ๋น„์–ด์žˆ๋Š” field = 0
# = ์šธํƒ€๋ฆฌ = 1
o = ์–‘ = 2
v = ๋Š‘๋Œ€ = 3
*/ 

int main(){
   ios_base::sync_with_stdio(false); cin.tie(0); cout.tie(0);

    int i, j =0;

    cin >> R >> C;

    for(i=0;i<R; i++){
        for(j=0; j<C; j++){
            char tmp;
            cin >> tmp;
            if (tmp == '.')
                map[i][j] = 0;
            else if (tmp == '#')
                map[i][j] = 1;
            else if (tmp == 'o')
                map[i][j] = 2;
            else if (tmp == 'v')
                map[i][j] = 3;

        }
    }
    int n, m  = 0;

    // cout <<"map------\n" ;
    // for(n=0; n<R; n++){
    //     for(m=0;m<C;m++){
    //         cout << map[n][m]<<" ";
    //     }
    //     cout <<"\n";
    // }

    // cout <<"\n";
    int finalnum[2]= {0,0};
    count(finalnum);
    cout << finalnum[0] << " " << finalnum[1];

}

void count(int* finalnum){
    int i, j=0;
    int n, m=0;
    int sheepwolf[2] = {0,0}; //{์–‘์˜ ์ˆ˜, ๋Š‘๋Œ€์ˆ˜}

    for(i=0; i<R; i++){
        for(j=0; j<C; j++){
            if(check[i][j]==0){
                DFS(i, j, sheepwolf);

                // cout << "check ------\n";
                // for(n=0; n<R; n++){
                //     for(m=0;m<C;m++){
                //         cout<<check[n][m]<<" ";
                //     }
                //     cout <<"\n";
                // }
                // cout <<"\n";

                if(sheepwolf[0]>sheepwolf[1]){
                    finalnum[0] += sheepwolf[0];
                }
                else {
                    finalnum[1] += sheepwolf[1];
                }
                sheepwolf[0] = 0 ; sheepwolf[1] = 0;
            }
        }
    }

}



void DFS (int x, int y, int* sheepwolf){
    if(check[x][y] == 1 || map[x][y] == 1)
        return;
    if (map[x][y] == 2) sheepwolf[0] ++;
    if (map[x][y]==3) sheepwolf[1] ++;

    check[x][y] = 1;

    if(x>0) DFS(x-1, y, sheepwolf);
    if(y>0) DFS(x, y-1, sheepwolf);
    if(x<R-1) DFS(x+1,y, sheepwolf);
    if(y<C-1) DFS(x,y+1, sheepwolf);

}

 

๊ทธ๋ฆฌ๊ณ  ๊น”๋”ํ•˜๊ฒŒ 1ํŠธ๋งŒ์— ๋งž์•˜์Œ

ํ–‰๋ณตํ•ด๋ผ.....์ด์ œ ๊ณจ๋“œ๋กœ ๋„์ „ํ•ด๋ณผ๊ฒŒ์šฉ