You will be fine

<Algorithm> 45. 14502번 연구소

by BFine
반응형

1. 14502번 연구소

  • BFS, DFS 중급 문제, DFS를 사용하여 벽을 세울 경우 백트레킹이 들어가야 한다.

  • 처음에 for문을 이용하여 벽을 세우려고 했지만 4중 for문에 또 DFS , 안전영역 체크 까지 for문이 많이 중첩되어 문제가 발생했다,

  • 벽을 세울때 DFS와 백트래킹을 이용하여 벽을 세우고 -> DFS (벽 3개가 될떄지 ) - > 벽 3개가 되면 BFS를 호출하고 끝나면 백트래킹

  • DFS로 영역을 확장하는 것 이외에 벽세우기 같은 순차적으로 반복했을 때도 사용 가능하다는 것을 알게된 문제


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
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
import java.io.BufferedReader;
import java.io.IOException;
import java.io.InputStreamReader;
import java.util.ArrayList;
import java.util.LinkedList;
import java.util.Queue;
import java.util.StringTokenizer;
 
public class Main {
    static boolean[][] visited;
    static int max = 0;
    static ArrayList<Coordinate> virus = new ArrayList<>();
    
    public static void main(String[] args) throws NumberFormatException, IOException {
        BufferedReader br =new BufferedReader(new InputStreamReader(System.in));
        StringTokenizer st = new StringTokenizer(br.readLine());
        int N = Integer.parseInt(st.nextToken());
        int M = Integer.parseInt(st.nextToken());
        int[][] arr = new int[N][M];
        
        for(int i = 0; i < N; i ++) {
            st = new StringTokenizer(br.readLine());
            for(int j = 0; j < M; j++) {
                arr[i][j] = Integer.parseInt(st.nextToken());
                if(arr[i][j] == 2) { // 바이러스가 있는 위치 확인
                    virus.add(new Coordinate(i, j));
                }
            }
        }
        dfs(arr, N, M, 0);
        
       System.out.println(max);
        
    }
        
    
    public static void dfs(int arr[][], int N, int M, int wall) {
        // 3개의 벽을 세우기 위한  dfs
        
        if(wall == 3) {
            visited = new boolean[N][M]; // 바이러스 영역 표시
            bfs(arr, N, M); // 바이러스 확장
            return;
        }
        
        for(int i = 0; i < N; i ++) {
            for(int j = 0; j < M; j ++) {
                if(arr[i][j] == 0) {
                    arr[i][j] = 1// 벽을 하나 세운다
                    dfs(arr, N, M, wall + 1); // 3개 세울떄까지 반복한다. 
                    arr[i][j] = 0// 백트레킹
                }
            }
        }
    }
    
    public static void bfs(int arr[][], int N, int M) {
        // 벽에 따른 바이러스 확장을 위한 BFS
        
        Queue<Coordinate> queue = new LinkedList<>();
        
        for(Coordinate loc : virus) {
            queue.add(new Coordinate(loc.x, loc.y));
        } // 최초 바이러스가 담겨있는 것을 큐에 다 담는다
        
        int dx [] = {001-1};
        int dy [] = {1-10};
        
        while(!queue.isEmpty()) {
            Coordinate loc = queue.remove();
            int x = loc.x;
            int y = loc.y;
            
            for(int i = 0; i < dx.length; i++) {
                   int nx = x + dx[i];    
                   int ny = y + dy[i];
                   
                   if(nx >= && ny >= && nx < N && ny < M && !visited[nx][ny] && arr[nx][ny] == 0) {
                           // 바이러스 영역 확장
                       queue.add(new Coordinate(nx, ny));
                           visited[nx][ny] = true;
                   }
            }
        }
        
        saftyArea(arr, N, M);// 안전영역 개수 확인
        
    }
    
    public static void saftyArea(int [][] arr, int N, int M) {
        int count = 0;
        
        for(int i = 0; i < N; i ++ ) {
            for(int j = 0; j < M ; j ++) {
                if!visited[i][j] && arr[i][j] == ) {
                    count++
                }
            }
        }
        max = Math.max(max, count);
        
    }
}
 
class Coordinate{
    int x, y;
 
    public Coordinate(int x, int y) {
        super();
        this.x = x;
        this.y = y;
    }
}
cs






반응형

블로그의 정보

57개월 BackEnd

BFine

활동하기