[JAVA/1303번] 전쟁 - 전투

고지훈·2021년 10월 31일
1

Algorithm

목록 보기
46/68
post-thumbnail

문제


입력 및 출력


풀이

import java.io.*;
import java.util.*;

class Main {
    public static int N;
    public static int M;
    public static int[] dx = {0, 0, -1, 1};
    public static int[] dy = {1, -1, 0, 0};

    public static String[][] map;
    public static boolean[][] visited;

    public static int team = 0;
    public static int enemy = 0;
    public static void main(String args[]) throws Exception {
        BufferedReader br = new BufferedReader(new InputStreamReader(System.in));

        // N, M
        String[] temp = br.readLine().split(" ");
        N = Integer.parseInt(temp[1]);
        M = Integer.parseInt(temp[0]);

        // 병사들을 배치할 지도
        map = new String[N][M];
        visited = new boolean[N][M];

        // 지도 데이터 입력
        for (int i = 0; i < N; i++) {
            temp = br.readLine().split("");
            for (int j = 0; j < temp.length; j++) {
                map[i][j] = temp[j];
            }
        }

        // BFS 메소드 호출(해당 위치의 병사에 따라서..)
        for (int i = 0; i < N; i++) {
            for (int j = 0; j < M; j++) {
                if (!visited[i][j]) {
                    if (map[i][j].equals("W")) {
                        int result = BFS(i, j, "W");
                        team += result * result;
                    } else {
                        int result = BFS(i, j, "B");
                        enemy += result * result;
                    }
                }
            }
        }

        // 결과 값 출력
        System.out.println(team + " " + enemy);
    }
    public static int BFS(int x, int y, String type) {
        // Node타입을 갖는 큐 선언
        Queue < Node > queue = new LinkedList < > ();

        int count = 1;

        // 큐에 시작 위치를 넣고 방문처리를 한다.
        queue.add(new Node(x, y));
        visited[x][y] = true;

        while (!queue.isEmpty()) {
            // 큐의 가장 앞에 있는 병사를 꺼낸다.
            Node node = queue.poll();

            // 이동할 수 있는 방향은 총 4가지(상, 하, 좌, 우)
            for (int i = 0; i < 4; i++) {
                int nx = node.x + dx[i];
                int ny = node.y + dy[i];

                if (isRange(nx, ny)) {
                    // 방문하지 않았고, 현재 위치가 입력받은 타입과 동일하다면
                    if (!visited[nx][ny] && type.equals(map[nx][ny])) {
                        queue.add(new Node(nx, ny));
                        visited[nx][ny] = true;
                        count++; // 개수 1 증가
                    }
                }
            }
        }
        return count;
    }

    public static boolean isRange(int x, int y) {
        if (x >= 0 && y >= 0 && x < N && y < M) {
            return true;
        }
        return false;
    }
}

class Node {
    // x축, y축
    int x, y;

    // Node 생성자
    public Node(int x, int y) {
        this.x = x;
        this.y = y;
    }
}

결과 및 해결방법

[결과]

[정리]

해결방법
코드를 보며 설명^_^

profile
"계획에 따르기보다 변화에 대응하기를"

0개의 댓글