λ³Έλ¬Έ λ°”λ‘œκ°€κΈ°
πŸ”₯ PS(Problem Solving) πŸ”₯/BOJ

[BOJ] #3187 μ–‘μΉ˜κΈ° 꿍

by dar0m! 2019. 10. 13.
μ‹œκ°„ μ œν•œ λ©”λͺ¨λ¦¬ μ œν•œ μ •λ‹΅ λΉ„μœ¨
1 초 128 MB 62.921%

 

 

3187번: μ–‘μΉ˜κΈ° 꿍

문제 μ–‘μΉ˜κΈ° 꿍은 맨날 λŠ‘λŒ€κ°€ λ‚˜νƒ€λ‚¬λ‹€κ³  λ§ˆμ„ μ‚¬λžŒλ“€μ„ μ†μ˜€μ§€λ§Œ 이젠 더이상 λ§ˆμ„ μ‚¬λžŒλ“€μ΄ 속지 μ•ŠλŠ”λ‹€. ν™”κ°€ λ‚œ 꿍은 λ³΅μˆ˜μ‹¬μ— λΆˆνƒ€ μ•„μ˜ˆ λŠ‘λŒ€λ“€μ„ 양듀이 μžˆλŠ” μšΈνƒ€λ¦¬μ•ˆμ— 마ꡬ 집어넣어 양듀을 μž‘μ•„λ¨Ήκ²Œ ν–ˆλ‹€. ν•˜μ§€λ§Œ 양듀은 보톡 양듀이 μ•„λ‹ˆλ‹€. 같은 μšΈνƒ€λ¦¬ μ˜μ—­ μ•ˆμ˜ μ–‘λ“€μ˜ μˆ«μžκ°€ λŠ‘λŒ€μ˜ μˆ«μžλ³΄λ‹€ λ” λ§Žμ„ 경우 λŠ‘λŒ€κ°€ μ „λΆ€ μž‘μ•„λ¨ΉνžŒλ‹€. λ¬Όλ‘  κ·Έ μ™Έμ˜ κ²½μš°λŠ” 양이 μ „λΆ€ μž‘μ•„λ¨Ήνžˆκ² μ§€λ§Œ 말이닀. 꿍은 μ›Œλ‚™ λ˜‘λ˜‘ν–ˆκΈ° λ•Œλ¬Έμ— μ΄λ“€μ˜ κ²°κ³ΌλŠ” 이미 μ•Œκ³ μžˆλ‹€. λ§Œμ•½ 빈

www.acmicpc.net

문제

μ–‘μΉ˜κΈ° 꿍은 λŠ‘λŒ€λ“€μ„ 양이 μžˆλŠ” μšΈνƒ€λ¦¬ μ•ˆμ— 마ꡬ μ§‘μ–΄λ„£μ—ˆλ‹€.

같은 μšΈνƒ€λ¦¬ μ˜μ—­ μ•ˆμ˜ μ–‘λ“€μ˜ μˆ«μžκ°€ λŠ‘λŒ€μ˜ μˆ«μžλ³΄λ‹€ 더 λ§Žμ€ 경우 λŠ‘λŒ€κ°€ μ „λΆ€ μž‘μ•„λ¨ΉνžŒλ‹€. λ¬Όλ‘  κ·Έ μ™Έμ˜ κ²½μš°λŠ” 양이 μ „λΆ€ μž‘μ•„λ¨ΉνžŒλ‹€.

빈 곡간을 '.'(점)으둜 λ‚˜νƒ€λ‚΄κ³  μšΈνƒ€λ¦¬λ₯Ό '#', λŠ‘λŒ€λ₯Ό 'v', μ–‘을 'k'라고 ν•  λ•Œ λͺ‡ λ§ˆλ¦¬μ˜ μ–‘κ³Ό λŠ‘λŒ€κ°€ μ‚΄μ•„남을지 κ³„μ‚°ν•˜μ—¬λΌ. 

단, μšΈνƒ€λ¦¬λ‘œ λ§‰νžˆμ§€ μ•Šμ€ μ˜μ—­μ—λŠ” μ–‘κ³Ό λŠ‘λŒ€κ°€ μ—†μœΌλ©° μ–‘κ³Ό λŠ‘λŒ€λŠ” λŒ€κ°μ„ μœΌλ‘œ μ΄λ™ν•  μˆ˜ μ—†λ‹€.

ν•΄κ²°λ°©μ•ˆ

DFS둜 μšΈνƒ€λ¦¬μ•ˆμ„ μ°¨λ‘€λ‘œ μ κ²€ν•˜μ—¬ ν•΄λ‹Ή μšΈνƒ€λ¦¬ μ•ˆμ˜ μ–‘κ³Ό λŠ‘λŒ€κ°€ λͺ‡ 마리 μ”© μžˆλŠ”μ§€ ν™•μΈν•˜κ³  DFSμ—μ„œ λΉ μ Έλ‚˜μ˜¬ λ•Œ ν•΄λ‹Ή μ–‘κ³Ό λŠ‘λŒ€κ°€ λͺ‡ λ§ˆλ¦¬μ˜€λŠ”μ§€ 비ꡐλ₯Ό ν•˜μ—¬ μ΅œμ’…μ μœΌλ‘œ λ‚¨μ•„μžˆλŠ” μ–‘κ³Ό λŠ‘λŒ€κ°€ λͺ‡ λ§ˆλ¦¬μΌμ§€ κ³„μ‚°ν•œλ‹€.

λ©”λͺ¨λ¦¬ μ‹œκ°„
3236 KB 0 ms
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
#include<iostream>
#include<string.h>
#include<queue>
using namespace std;
#define F(x,y,u,p) for(int x = 0 ; x<u; x++)for(int y = 0; y<p; y++)
typedef pair<intint> p;
int dx[] = { 0,1,0,-1 }, dy[] = { 1,0,-1,0 };
int n, m, chk[255][255], sheep, wolf, sheep_cnt, wolf_cnt;
char arr[255][255];
void dfs(int r, int c) {
    chk[r][c] = 1;
    for (int i = 0; i < 4; i++) {
        int nr = r + dx[i], nc = c + dy[i];
        if (nr < 0 || nr >= n || nc < 0 || nc >= m || chk[nr][nc] || arr[nr][nc] == '#'continue;
        if (arr[nr][nc] == 'v') wolf_cnt++;
        else if (arr[nr][nc] == 'k') sheep_cnt++;
        dfs(nr, nc);
    }
    
}
int main() {
    scanf("%d %d"&n, &m);
    for (int i = 0; i < n; i++) {
        scanf("%s", arr[i]);
    }
    F(i, j, n, m) {
        sheep_cnt = 0, wolf_cnt = 0;
        if (!chk[i][j]) {
            dfs(i, j);
            if (sheep_cnt > wolf_cnt) {
                sheep += sheep_cnt;
            }
            else {
                wolf += wolf_cnt;
            }
        }
    }
    printf("%d %d", sheep, wolf);
    return 0;
}
 
 
cs

 

λŠλ‚€μ 

μ˜€λžœλ§Œμ— BFSλ₯Ό ν’€λ‹€κ°€ DFS둜 ν’€λ €λ‹ˆ 방식이 κ°™μ§€λ§Œ λ‹€λ₯΄λ‹€κ³  μƒκ°ν–ˆλ‹€. ν˜„μž¬ 보고 μžˆλŠ” μœ„μΉ˜ 이후 λ‹€μŒ μœ„μΉ˜λ‘œ 이동을 ν•  λ•Œ BFSλŠ” 큐λ₯Ό ν†΅ν•΄μ„œ ν•˜κ³ , DFSλŠ” ν•¨μˆ˜λ₯Ό ν†΅ν•΄μ„œ 탐색을 ν•œλ‹€λŠ” 것을 μƒκΈ°μ‹œν‚¬ 수 μžˆμ—ˆλ‹€.

μ΄λž˜μ„œ λ¬Έμ œλŠ” κΎΈμ€€νžˆ ν’€μ–΄μ•Ό ν•˜λ‚˜λ³΄λ‹€. ν™”μ΄νŒ…!

λŒ“κΈ€