반응형
12-13 01:00
Today
Total
«   2024/12   »
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
관리 메뉴

개발하는 고라니

[백준] 3187번 : 양치기 꿍 본문

Programming/백준

[백준] 3187번 : 양치기 꿍

조용한고라니 2021. 3. 19. 23:32
반응형
 

3187번: 양치기 꿍

입력의 첫 번째 줄에는 각각 영역의 세로와 가로의 길이를 나타내는 두 개의 정수 R, C (3 ≤ R, C ≤ 250)가 주어진다. 다음 각 R줄에는 C개의 문자가 주어지며 이들은 위에서 설명한 기호들이다.

www.acmicpc.net


[DFS or BFS]

나는 DFS를 연습할 겸 DFS로 풀었다. R x C의 지도에서 벽으로 둘러쌓인 각 영역내의 늑대와 양의 개수를 찾아 전체 늑대와 양의 개수에 변화를 주었다.

 

지도를 입력 받을 때 전체 양의 개수와 늑대의 개수를 파악하고, 각 영역을 DFS 돌며 그 영역의 늑대와 양의 개수를 파악해 늑대 >= 양이면 전체 양에서 해당 양만큼 줄이고, 반대면 늑대를 줄인다.

# Code </>

import java.io.BufferedReader;
import java.io.IOException;
import java.io.InputStreamReader;
import java.util.StringTokenizer;

public class Main {

    static int r, c, wolves, sheeps, wolf, sheep;
    static int[] Y = {-1, 1, 0, 0}, X = {0, 0, -1, 1};
    static char[][] map = new char[251][251];
    static boolean[][] visit = new boolean[251][251];

    static void DFS(int y, int x){

        visit[y][x] = true;
        if(map[y][x] == 'k') sheep++;
        else if(map[y][x] == 'v') wolf++;

        for(int a=0; a<4; a++){
            int ny = y+Y[a];
            int nx = x+X[a];

            if(ny < 1 || nx < 1 || ny > r || nx > c || visit[ny][nx] || map[ny][nx] == '#') continue;

            DFS(ny, nx);
        }
    }

    public static void main(String[] args) throws IOException {
        BufferedReader br = new BufferedReader(new InputStreamReader(System.in));
        StringTokenizer st = new StringTokenizer(br.readLine());

        r = Integer.parseInt(st.nextToken());
        c = Integer.parseInt(st.nextToken());

        for(int i=1; i<=r; i++){
            char[] str = br.readLine().toCharArray();
            for(int j=1; j<=c; j++) {
                map[i][j] = str[j - 1];

                if(map[i][j] == 'k') sheeps++;
                else if(map[i][j] == 'v') wolves++;
            }
        }

        for(int i=1; i<=r; i++)
            for(int j=1; j<=c; j++)
                if(map[i][j] != '#' && !visit[i][j]) {
                    wolf = 0;
                    sheep = 0;
                    DFS(i, j);

                    if (wolf >= sheep) sheeps -= sheep;
                    else wolves -= wolf;
                }
        System.out.print(sheeps + " " + wolves);
    }
}
반응형

'Programming > 백준' 카테고리의 다른 글

[백준] 2023번 : 신기한 소수  (0) 2021.03.20
[백준] 14716번 : 현수막  (0) 2021.03.19
[백준] 10473번 : 인간 대포  (0) 2021.03.19
[백준] 6087번 : 레이저 통신  (0) 2021.03.18
[백준] 13424번 : 비밀 모임  (0) 2021.03.17
Comments