베오
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] 13565번: 침투

2022. 11. 4. 16:26

키워드

  • 차원 격자의 위쪽을 바깥쪽(outer side), 아래쪽을 안쪽(inner side)
  • 각 격자는 검은색 아니면 흰색
  • 검은색은 전류를 차단하는 물질임을 뜻하고 흰색은 전류가 통할 수 있는 물질
  • 상하좌우로 인접한 흰색 격자들로 전달

구현

배열의 0행에서 0인 곳을 깊이 우선 탐색 (DFS)를 사용한다.

깊이 우선 탐색을 실행하면서 y값이 M-1이 되는 순간 결과는 YES가 되도록 처리한다.


코드

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

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

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

    static boolean result;

    public static void DFS(int y, int x, boolean[][] isVisited) {
        if (y == board.length - 1) {
            result = true;
            return;
        }

        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]) {
                    // 0이여야 한다.
                    if (board[toY][toX] == 0) {
                        isVisited[toY][toX] = true;
                        DFS(toY, toX, isVisited);
                    }
                }
            } catch (ArrayIndexOutOfBoundsException e) {
                continue;
            }
        }
    }

    public static void DFSAll() {
        result = false;

        boolean isVisited[][] = new boolean[M][N];

        // 가장 위 부터 시작
        for (int i = 0; i < N; i++) {
            // 방문하지 않았다면..
            if (!isVisited[0][i]) {
                // 전류가 통한다면..
                if (board[0][i] == 0) {
                    // DFS 시작
                    DFS(0, i, isVisited);
                }
            }
        }
    }

    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());

        board = new int[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) - '0';
            }
        }

        DFSAll();

        if (result) {
            System.out.println("YES");
        } else {
            System.out.println("NO");
        }

        br.close();
    }
}

저작자표시 (새창열림)

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

[BOJ/JAVA] 1303번: 전쟁 - 전투  (0) 2022.11.04
[BOJ/JAVA] 17471번: 게리맨더링  (0) 2022.11.04
[BOJ/JAVA] 1541번: 잃어버린 괄호  (0) 2022.10.24
[BOJ/JAVA] 5582번: 공통 부분 문자열  (0) 2022.10.24
[BOJ/JAVA] 2607번: 비슷한 단어  (0) 2022.10.24
    'Coding Test/BOJ' 카테고리의 다른 글
    • [BOJ/JAVA] 1303번: 전쟁 - 전투
    • [BOJ/JAVA] 17471번: 게리맨더링
    • [BOJ/JAVA] 1541번: 잃어버린 괄호
    • [BOJ/JAVA] 5582번: 공통 부분 문자열
    베오
    베오

    티스토리툴바