프로그래밍 공방

[백준] 1113번 : 수영장 만들기 본문

개발/문제해결

[백준] 1113번 : 수영장 만들기

hyosupsong 2020. 12. 23. 16:48

문제

www.acmicpc.net/problem/1113

 

1113번: 수영장 만들기

지민이는 수영장을 만들려고 한다. 수영장을 만들 곳의 크기는 N*M이고, 각 칸은 직육면체이다. 따라서, 각 칸의 직육면체의 높이가 쓰여 있는 다음과 같은 땅을 생각할 수 있다. 16661 61116 16661 이

www.acmicpc.net

문제해결방법

수영장의 넓이를 구하기 위해 물의 높이와 땅의 높이의 차를 계산한 배열을 따로 계산해두었다.

높이의 차가 양수인 영역들 중에 배열의 가장자리와 닿지 않는 영역들을 모두 더하면 수영장의 넓이가 된다.

코드

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
import java.io.BufferedReader;
import java.io.InputStreamReader;
import java.util.ArrayDeque;
import java.util.Queue;
import java.util.StringTokenizer;
 
public class Main {
    public static int N, M;
    public static int[][] map, tempMap;
    public static int[][] dir = {{10}, {-10}, {01}, {0-1}};
 
    public static void makeTempMap(int h) {
        for(int i=0; i<N; i++) {
            for(int j=0; j<M; j++) tempMap[i][j] = h - map[i][j];
        }
    }
 
    public static int calPool(int i, int j) {
        boolean flood = false;
        int size = 0;
        Queue<int[]> q = new ArrayDeque<>();
        q.add(new int[]{i, j});
        size += 1;
        tempMap[i][j] = 0;
        while(!q.isEmpty()) {
            int[] cur = q.poll();
            for(int d=0; d<dir.length; d++) {
                int xx = cur[0+ dir[d][0];
                int yy = cur[1+ dir[d][1];
                if(xx>=0 && xx<&&yy>=0 && yy<M) {
                    if(tempMap[xx][yy]>0) {
                        size += 1;
                        tempMap[xx][yy] = 0;
                        q.add(new int[]{xx, yy});
                    }
                } else flood = true;
            }
        }
        if(flood) size = 0;
        return size;
    }
 
    public static void main(String[] args) throws Exception {
        BufferedReader br = new BufferedReader(new InputStreamReader(System.in));
        StringTokenizer st = new StringTokenizer(br.readLine());
        N = Integer.parseInt(st.nextToken());
        M = Integer.parseInt(st.nextToken());
        map = new int[N][M];
        tempMap = new int[N][M];
        for(int i=0; i<N; i++) {
            String s = br.readLine();
            for(int j=0; j<M; j++) map[i][j] = s.charAt(j) -'0';
        }
        int size = 0;
        for(int h=9; h>=1; h--) {
            makeTempMap(h);
            for(int i=0; i<N; i++) {
                for(int j=0; j<M; j++) {
                    if(tempMap[i][j]>0) {
                        size += calPool(i, j);
                    }
                }
            }
        }
        System.out.println(size);
    }
}
cs


코드에 대한 피드백이나 더 좋은 아이디어는 언제나 환영입니다.