프로그래밍 공방

[백준] 16932번 : 모양 만들기 본문

개발/문제해결

[백준] 16932번 : 모양 만들기

hyosupsong 2020. 12. 29. 01:39

문제

www.acmicpc.net/problem/16932

 

16932번: 모양 만들기

N×M인 배열에서 모양을 찾으려고 한다. 배열의 각 칸에는 0과 1 중의 하나가 들어있다. 두 칸이 서로 변을 공유할때, 두 칸을 인접하다고 한다. 1이 들어 있는 인접한 칸끼리 연결했을 때, 각각의

www.acmicpc.net

문제해결방법

이 문제를 해결하기 위해, 0인 곳을 1로 만들어서 상, 하, 좌, 우에 있는 모양들이 연결되도록 하고, 그 결과로 만들어지는 가장 큰 모양을 찾아야 겠다고 생각했다.

1. 처음에 배열을 돌면서 BFS를 통해 연결 요소들을 찾아 각 연결 요소에 번호를 붙이고 Map에 그 번호를 Key로 사이즈를 Value로 해서 저장해줬다.

2. 다시 한 번 배열을 돌면서 0인 곳마다 상, 하, 좌, 우를 탐색하며 만약 인접한 곳이 0이 아닌 다른 값이라면 Map에서 해당 값을 Key로 하는 Value(연결 요소의 사이즈)를 가져와 더해줬다.
* 인접한 요소들이 중복이 될 수 있으므로 Set에 넣어서 중복을 제거해줬다.

3. 2번 과정을 진행하며 계산된 크기중에 가장 큰 사이즈가 가장 큰 모양의 사이즈이다.

코드

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
package baekjoon;
 
import java.io.BufferedReader;
import java.io.InputStreamReader;
import java.util.ArrayDeque;
import java.util.HashMap;
import java.util.HashSet;
import java.util.Map;
import java.util.Queue;
import java.util.Set;
import java.util.StringTokenizer;
 
public class Main16932_모양만들기 {
    public static int N, M, max = 0;
    public static int[][] map;
    public static int[][] dir = {{10}, {-10}, {01}, {0-1}};
    public static Map<Integer, Integer> land = new HashMap<Integer, Integer>();
    
    public static void bfs(int i, int j, int key) {
        int count = 1;
        Queue<int[]> q = new ArrayDeque<>();
        q.add(new int[]{i, j});
        map[i][j] = key;
        while(!q.isEmpty()) {
            int[] cur = q.poll();
            for(int d=0; d<dir.length; d++) {
                int x = cur[0+ dir[d][0];
                int y = cur[1+ dir[d][1];
                if(x>=0 && x<&& y>=0 && y<&& map[x][y]==1) {
                    map[x][y] = key;
                    count++;
                    q.add(new int[]{x, y});
                }
            }
        }
        land.put(key, count);
    }
    
    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];
        for(int i=0; i<N; i++) {
            String s = br.readLine();
            for(int j=0; j<M; j++) map[i][j] = s.charAt(j*2)-'0';
        }
        int key = 2;
        for(int i=0; i<N; i++) {
            for(int j=0; j<M; j++) {
                if(map[i][j]==1) bfs(i, j, key++);
            }
        }
        Set<Integer> keySet = new HashSet<Integer>();
        for(int i=0; i<N; i++) {
            for(int j=0; j<M; j++) {
                if(map[i][j]==0) {
                    keySet.clear();
                    int size = 1;
                    for(int d=0; d<dir.length; d++) {
                        int x = i + dir[d][0];
                        int y = j + dir[d][1];
                        if(x>=0 && x<&& y>=0 && y<&& map[x][y]!=0) {
                            keySet.add(map[x][y]);
                        }
                    }
                    for(int k : keySet) {
                        size += land.get(k);
                    }
                    if(max<size) max = size;
                }
            }
        }
        System.out.println(max);
    }
}
cs


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

'개발 > 문제해결' 카테고리의 다른 글

[프로그래머스] 비밀지도  (0) 2020.12.30
[프로그래머스] 보석 쇼핑  (0) 2020.12.29
[백준] 1113번 : 수영장 만들기  (0) 2020.12.23
[백준] 16234번 : 인구 이동  (0) 2020.12.17
[백준] 1058번 : 친구  (0) 2020.12.17