반응형
12-24 07:02
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
관리 메뉴

개발하는 고라니

[백준] 1303번 : 전쟁 - 전투 본문

Programming/백준

[백준] 1303번 : 전쟁 - 전투

조용한고라니 2021. 4. 1. 12:42
반응형
 

1303번: 전쟁 - 전투

첫째 줄에는 전쟁터의 가로 크기 N, 세로 크기 M(1 ≤ N, M ≤ 100)이 주어진다. 그 다음 두 번째 줄에서 M+1번째 줄에는 각각 (X, Y)에 있는 병사들의 옷색이 띄어쓰기 없이 주어진다. 모든 자리에는

www.acmicpc.net


[DFS or BFS]

2차원 배열이 map으로 주어지는 문제에서는 늘 BFS로 풀었어서 이번엔 DFS로 풀어보았다.

 

B와 W로 이루어진 지도를 char로 그대로 저장하지 않고 boolean으로 저장하였다. W 이면 true로, B이면 false로. 물론 char[][]로 저장하여도 상관없다.

 

이제 2차원 배열 모든 정점을 방문할 차례인데, B로 이루어진 덩어리와 W로 이루어진 덩어리의 개수를 Math.pow해서 반환하도록 했다.

 

DFS함수의 내부는 다음과 같이 인접한 정점을 방문할 때마다 cnt가 +1씩 되어 최종적으로 반환되는 cnt는 그 덩어리의 크기를 반환하게 된다.

    static int DFS(int y, int x, boolean isWhite){

        int cnt = 1;
        visit[y][x] = true;

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

            if(ny < 1 || nx < 1 || ny > n || nx > m || visit[ny][nx] || map[ny][nx] != isWhite) continue;

            cnt += DFS(ny, nx, isWhite);
        }

        return cnt;
    }

# Code </>

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

public class Main {

    static int n, m, white = 0, black = 0;
    static int[] Y = {-1, 1, 0, 0}, X = {0, 0, -1, 1};
    static boolean[][] visit = new boolean[101][101], map = new boolean[101][101];

    static int DFS(int y, int x, boolean isWhite){

        int cnt = 1;
        visit[y][x] = true;

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

            if(ny < 1 || nx < 1 || ny > n || nx > m || visit[ny][nx] || map[ny][nx] != isWhite) continue;

            cnt += DFS(ny, nx, isWhite);
        }

        return cnt;
    }

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

        m = Integer.parseInt(st.nextToken());
        n = Integer.parseInt(st.nextToken());

        for(int i=1; i<=n; i++){
            char[] str = br.readLine().toCharArray();

            for(int j=1; j<=m; j++)
                map[i][j] = str[j-1] == 'W';
        }

        for(int i=1; i<=n; i++)
            for(int j=1; j<=m; j++)
                if(!visit[i][j]){
                    if(map[i][j])
                        white += Math.pow(DFS(i, j, map[i][j]), 2);
                    else
                        black += Math.pow(DFS(i, j, map[i][j]), 2);
                }

        System.out.println(white + " " + black);
    }
}
반응형

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

[백준] 16724번 : 피리 부는 사나이  (0) 2021.04.02
[백준] 16437번 : 양 구출 작전  (0) 2021.04.01
[백준] 17090번 : 미로 탈출하기  (0) 2021.03.31
[백준] 1501번 : 영어 읽기  (0) 2021.03.30
[백준] 1068번 : 트리  (0) 2021.03.30
Comments