베오
DCode
베오
전체 방문자
오늘
어제
  • 분류 전체보기 (218)
    • 공지사항 (1)
    • 잡설 (1)
    • Programming (33)
      • [C] (1)
      • [Java] (4)
      • [Python] (2)
      • [Android] (2)
      • [Network] (0)
      • [Operation System] (2)
      • [Spring Boot] (22)
      • [Docker] (0)
    • Algorithm (31)
      • 자료구조 (2)
      • 알고리즘 (Java) (14)
      • 알고리즘 (기초) (15)
    • Coding Test (131)
      • BOJ (131)
      • Algospat (0)
    • 이론적인거 (14)
      • 보안 (5)
      • 오류 해결 (2)
      • 디자인 패턴 (5)
      • 네트워크 (1)
      • 기타 (1)
    • 최신기술 (4)
      • 블록체인 (1)
    • [Project] (1)

블로그 메뉴

  • 🐈‍⬛ GitHub
  • 📫 방명록
  • 🔖 태그

공지사항

인기 글

티스토리

hELLO · Designed By 정상우.
베오

DCode

Coding Test/BOJ

[BOJ/JAVA] 1303번: 전쟁 - 전투

2022. 11. 4. 16:27

키워드

  • 당신의 병사들은 **흰색 옷**을 입고, 적국의 병사들은 **파란색 옷**을 입었기 때문에 서로가 적인지 아군인지는 구분할 수 있다.
  • N명이 뭉쳐있을 때는 **N^2의 위력**을 낼 수 있다.

구현

[0][0] 부터 깊이 우선 탐색을 하면서 각 탐색 마다 방문 횟수를 저장하고, 방문 횟수의 제곱을 결과 score에 누적합을 한다.


코드

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

public class java_1303 {
    final static int dydx[][] = { { -1, 0 }, { 1, 0 }, { 0, -1 }, { 0, 1 } };

    static int N, M;
    static char board[][];

    static int blueScore, whiteScore;
    static boolean isVisited[][];

    public static int DFS(int y, int x) {
        int result = 1;

        for (int i = 0; i < dydx.length; i++) {
            int toY = y + dydx[i][0];
            int toX = x + dydx[i][1];

            try {
                if (!isVisited[toY][toX]) {
                    if (board[y][x] == board[toY][toX]) {
                        isVisited[toY][toX] = true;
                        result += DFS(toY, toX);
                    }

                }
            } catch (ArrayIndexOutOfBoundsException e) {
                continue;
            }
        }

        return result;
    }

    public static void DFSAll() {
        isVisited = new boolean[M][N];

        for (int i = 0; i < M; i++) {
            for (int j = 0; j < N; j++) {
                if (!isVisited[i][j]) {
                    isVisited[i][j] = true;
                    // White, 아군의 경우
                    if (board[i][j] == 'W') {
                        whiteScore += Math.pow(DFS(i, j), 2);
                    }
                    // Blue, 적군의 경우
                    else if (board[i][j] == 'B') {
                        blueScore += Math.pow(DFS(i, j), 2);
                    }
                }
            }
        }
    }

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

        StringTokenizer st = new StringTokenizer(br.readLine());

        // col
        N = Integer.parseInt(st.nextToken());
        // row
        M = Integer.parseInt(st.nextToken());

        board = new char[M][N];

        for (int i = 0; i < M; i++) {
            String data = br.readLine();
            for (int j = 0; j < N; j++) {
                board[i][j] = data.charAt(j);
            }
        }

        DFSAll();

        System.out.printf("%d %d\\n", whiteScore, blueScore);

        br.close();
    }
}

저작자표시 (새창열림)

'Coding Test > BOJ' 카테고리의 다른 글

[BOJ/JAVA] 1063번: 킹  (0) 2022.11.07
[BOJ/JAVA] 20058번: 마법사 상어와 파이어스톰  (0) 2022.11.07
[BOJ/JAVA] 17471번: 게리맨더링  (0) 2022.11.04
[BOJ/JAVA] 13565번: 침투  (0) 2022.11.04
[BOJ/JAVA] 1541번: 잃어버린 괄호  (0) 2022.10.24
    'Coding Test/BOJ' 카테고리의 다른 글
    • [BOJ/JAVA] 1063번: 킹
    • [BOJ/JAVA] 20058번: 마법사 상어와 파이어스톰
    • [BOJ/JAVA] 17471번: 게리맨더링
    • [BOJ/JAVA] 13565번: 침투
    베오
    베오

    티스토리툴바