BOJ/C++
[BOJ] 16932. 모양 만들기
IamToday
2020. 4. 20. 20:18
* 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 |