본문 바로가기

BOJ/C++

[BOJ] 16932. 모양 만들기

* dfs를 이용하여 1로 이루어진 그룹을 라벨링한다. (그룹에 몇 개의 1이 있는지 labelCnt[]에 저장한다)

* 현재 좌표의 값이 1이고, 상 하 좌 우 인접한 값이 0인 좌표를 중심으로 탐색을 한다. 

인접한 좌표에 0이 있다면 이 값을 1로 바꾸고 다른 그룹들과 합쳐질 수 있다. -> 이를 가능하게 하려면, 0인 좌표의 인접한 칸에 다른 그룹이 있어야 한다. 

* 만약, 0인 좌표가 다른 그룹과 인접해 있다면 (연합 그룹을 형성하는 1의 개수와 현재 그룹의 개수 +1 )의 최대값이 정답이 된다. 

* 주의해야 할 점은, 0이 같은 그룹으로 이루어진 1들로 둘러싸여져있을 수 있기 때문에 중복으로 더해주는 것을 방지해야 한다. 

(set에 그룹의 라벨을 넣어주어서 중복으로 세지 않도록 하였다. )

1 1 0 0 0
1 1 0 0 0
1 0 1 0 0
0 1 1 0 0
0 0 0 0 0
1 1 0 0 0
1 1 0 0 0
1 0 2 0 0
0 2 2 0 0
0 0 0 0 0

 

 

'BOJ > C++' 카테고리의 다른 글

[BOJ] 17085. 십자가 2개 놓기  (0) 2020.04.20
[BOJ] 16939. 2X2X2 큐브  (0) 2020.04.20
[BOJ] 17822. 원판 돌리기  (0) 2020.04.19
[BOJ] 16918. 봄버맨  (0) 2020.04.17
[BOJ] 9328. 열쇠  (0) 2020.04.16