코딩문제풀이/Baekjoon

[Java] 백준 3184번 : 양

코딩하는 포메라니안 2022. 12. 17. 15:56

1. 문제

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

 

3184번: 양

첫 줄에는 두 정수 R과 C가 주어지며(3 ≤ R, C ≤ 250), 각 수는 마당의 행과 열의 수를 의미한다. 다음 R개의 줄은 C개의 글자를 가진다. 이들은 마당의 구조(울타리, 양, 늑대의 위치)를 의미한다.

www.acmicpc.net

 

 

2. 풀이과정

1. 울타리가 아니면 dfs 탐색 시작

2. 탐색하면서 늑대와 양의 수를 센다.

3. 탐색이 끝나면 늑대와 양의 수를 비교해서 결과에 반영한다.

import java.io.BufferedReader;
import java.io.InputStreamReader;

public class Main {
    static int N, M, dx[] = {-1, 0, 1, 0}, dy[] = {0, 1, 0, -1};
    static int wolf, sheep;
    static char map[][];
    static boolean visited[][];

    public static void dfs(int x, int y){
        if(map[x][y]=='v') wolf++;
        else if(map[x][y]=='o') sheep++;

        for(int i=0; i<4; i++){
            int nx = x + dx[i];
            int ny = y + dy[i];
            if(nx<0 || nx>=N || ny<0 || ny>=M || map[nx][ny]=='#' || visited[nx][ny]){
                continue;
            }
            visited[nx][ny] = true;
            dfs(nx, ny);
        }

    }

    public static void main(String[] args) throws Exception {
        BufferedReader br = new BufferedReader(new InputStreamReader(System.in));
        String inputs[] = br.readLine().split(" ");
        N = Integer.parseInt(inputs[0]);
        M = Integer.parseInt(inputs[1]);
        map = new char[N][M];
        visited = new boolean[N][M];

        for(int i=0; i<N; i++){
            map[i] = br.readLine().toCharArray();
        }

        int s = 0, w = 0;
        for(int i=0; i<N; i++){
            for(int j=0; j<M; j++){
                if(visited[i][j] || map[i][j]=='#'){continue;}
                wolf = sheep = 0;
                visited[i][j] = true;
                dfs(i, j);
                if(sheep > wolf) s += sheep;
                else w += wolf;
            }
        }
        System.out.println(s+" "+w);
    }
}

 

 

결과