본문 바로가기
백준

[JAVA] 백준 14502 - 연구소

by 맴썰 2025. 8. 29.

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

처음 봤을 때 dfs로 푸는 문제인건 알겠는데 벽을 세우되 꼭 세개를 세우래서 벽을 어떻게 세울까 고민을 많이 했는데 어떤 기준을 가지고 하기에는 고려할 점이 너무 많았다. 

[첫째 줄에 지도의 세로 크기 N과 가로 크기 M이 주어진다. (3 ≤ N, M ≤ 8)]

-> 지도의 넓이 범위가 생각보다 크지 않은 것을 보고 브루트 포스가 아닐까 하고 6중 포문으로 전체 탐색 후 각 케이스마다 DFS를 돌려봤는데 성공했다.

import java.io.BufferedReader;
import java.io.IOException;
import java.io.InputStreamReader;
import java.util.ArrayList;
import java.util.Arrays;
import java.util.List;

public class Main {

    public static void main(String[] args) throws IOException {
        BufferedReader br = new BufferedReader(new InputStreamReader(System.in));
        int[] a = Arrays.stream(br.readLine().split(" ")).mapToInt(Integer::parseInt).toArray();
        int[][] map = new int[a[0]][a[1]];
        List<String> vList = new ArrayList<>();
        for (int i = 0; i < map.length; i++) {
            map[i] = Arrays.stream(br.readLine().split(" ")).mapToInt(Integer::parseInt).toArray();
            for (int j = 0; j < map[i].length; j++) {
                if (map[i][j] == 2) {
                    vList.add(i + " " + j);
                }
            }
        }
        int count = Integer.MIN_VALUE;
        for (int i1 = 0; i1 < map.length; i1++) {
            for (int j1 = 0; j1 < map[0].length; j1++) {
                if (map[i1][j1] != 0) continue;
                map[i1][j1] = 1;
                for (int i2 = 0; i2 < map.length; i2++) {
                    for (int j2 = 0; j2 < map[0].length; j2++) {
                        if (map[i2][j2] != 0) continue;
                        map[i2][j2] = 1;
                        for (int i3 = 0; i3 < map.length; i3++) {
                            for (int j3 = 0; j3 < map[0].length; j3++) {
                                if (map[i3][j3] != 0) continue;
                                map[i3][j3] = 1;
                                count = Math.max(count, getCount(map, vList));
                                map[i3][j3] = 0;
                            }
                        }
                        map[i2][j2] = 0;
                    }

                }
                map[i1][j1] = 0;
            }
        }
        System.out.println(count);
    }

    static int getCount(int[][] map, List<String> vList) {
        boolean[][] visited = new boolean[map.length][map[0].length];
        for (String s : vList) {
            int[] arr = Arrays.stream(s.split(" ")).mapToInt(Integer::parseInt).toArray();
            dfs(arr[0], arr[1], map, visited);
        }
        int count = 0;
        for (int i = 0; i < map.length; i++) {
            for (int j = 0; j < map[0].length; j++) {
                if (map[i][j] == 0 && !visited[i][j]) count++;
            }
        }
        return count;
    }

    static void dfs(int i, int j, int[][] map, boolean[][] visited) {
        visited[i][j] = true;
        if (check(i - 1, j, map, visited)) dfs(i - 1, j, map, visited);
        if (check(i + 1, j, map, visited)) dfs(i + 1, j, map, visited);
        if (check(i, j - 1, map, visited)) dfs(i, j - 1, map, visited);
        if (check(i, j + 1, map, visited)) dfs(i, j + 1, map, visited);
    }

    static boolean check(int i, int j, int[][] map, boolean[][] visited) {
        if (i < 0 || i >= map.length) return false;
        if (j < 0 || j >= map[0].length) return false;
        if (visited[i][j]) return false;
        if (map[i][j] == 1) return false;
        return map[i][j] != 2;
    }
}

조건 생각하다가 머리가 아팠던 문제였다.

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

[JAVA] 백준 17144 - 미세먼지 안녕!  (2) 2025.08.30
[JAVA] 백준 14938 - 서강그라운드  (0) 2025.08.29
[JAVA] 백준 13172 - Σ  (2) 2025.08.28
[JAVA] 백준 12851 - 숨바꼭질 2  (0) 2025.08.25
[JAVA] 백준 11404 - 플로이드  (0) 2025.08.25