ABOUT ME

-

Today
-
Yesterday
-
Total
-
  • boj)2573 - 빙산
    PS/boj 2020. 10. 24. 12:39
    import java.io.*;
    import java.util.*;
    
    public class boj_2573 {
        static BufferedReader br = new BufferedReader(new InputStreamReader(System.in));
        static StringTokenizer st;
        static int N, M, nx, ny;
        static int[][][] map;
        static int[] dx = {-1, 1, 0, 0};
        static int[] dy = {0, 0, -1, 1};
    
        public static void main(String[] args) throws IOException {
            st = new StringTokenizer(br.readLine());
            N = Integer.parseInt(st.nextToken());
            M = Integer.parseInt(st.nextToken());
    
            map = new int[N][M][2];
            for (int i = 0; i < N; i++) {
                st = new StringTokenizer(br.readLine());
                for (int j = 0; j < M; j++) {
                    map[i][j][0] = Integer.parseInt(st.nextToken());
                }
            }
    
            int year = 0;
    
            while (true) {
                int cnt = 0;
                year++;
    
                // 1년 단위로 빙산 주위에 바다 갯수 체크
                for (int i = 1; i < N-1; i++) {
                    for (int j = 1; j < M-1; j++) {
                        if (map[i][j][0] > 0) {
                            cnt++;
    
                            for (int k = 0; k < 4; k++) {
                                nx = i + dx[k];
                                ny = j + dy[k];
    
                                if (map[nx][ny][0] == 0) {
                                    map[i][j][1]++;
                                }
                            }
                        }
                    }
                }
    
                // 빙산이 없음 
                if (cnt == 0) {
                    System.out.println(0);
                    break;
                }
    
                // 주위의 바다 갯수만큼 빙산 높이 줄이기
                for (int i = 1; i < N-1; i++) {
                    for (int j = 1; j < M-1; j++) {
                        if (map[i][j][0] > 0) {
                            map[i][j][0] -= map[i][j][1];
                            map[i][j][1] = 0;
                        }
                        if (map[i][j][0] < 0) map[i][j][0] = 0;
                    }
                }
    
                // 빙산 덩어리 갯수 카운팅
                int ans = 0;
                Stack<int[]> s = new Stack<>();
                boolean[][] v = new boolean[N][M];
    
                for (int i = 1; i < N-1; i++) {
                    for (int j = 1; j < M-1; j++) {
                        if (map[i][j][0] > 0 && !v[i][j]) {
                            v[i][j] = true;
                            s.push(new int[] {i, j});
                            ans++;
    
                            while(!s.isEmpty()) {
                                int[] now = s.pop();
    
                                for (int k = 0; k < 4; k++) {
                                    nx = now[0] + dx[k];
                                    ny = now[1] + dy[k];
    
                                    if (map[nx][ny][0] > 0 && !v[nx][ny]) {
                                        v[nx][ny] = true;
                                        s.push(new int[] {nx, ny});
                                    }
                                }
                            }
    
                        }
                    }
                }
    
                // 덩어리 수가 2개 이상일 경우
                if (ans >= 2) {
                    System.out.println(year);
                    break;
                }
            }
    
        }
    }
    

     

    - 이제 dfs/bfs에 어느정도 감이 오는것 같다.

    - 다른 사람 코드 보니까 내 코드 길이는 거의 2배인거 같다 ..

     

    - map을 map[N][M][2] 로 만들어서 마지막 배열쪽에 바다 갯수 카운팅을 저장했다.

    'PS > boj' 카테고리의 다른 글

    boj)13023 - ABCDE  (0) 2020.10.29
    boj)2206 - 벽 부수고 이동하기  (0) 2020.10.24
    boj)1629 - 곱셈  (0) 2020.10.23
    boj)2468 - 안전 영역  (0) 2020.10.21
    boj)10026 - 적록색약  (0) 2020.10.21
킹수빈닷컴