-
[알고리즘] 백준 2667번 단지번호붙이기 ( BFS )프로그래밍/알고리즘 2019. 3. 26. 18:11
백준 2667번 단지번호붙이기
오늘은 단지번호붙이기 문제를 풀어보았다.
원래 그림이나 이차원배열이 나오는 문제는 보기만해도 풀기 싫어서 넘기곤 했는데, BFS, DFS를 연습하면서 이제 그나마 거부감이 많이 줄었다.
문제는 2차원배열내에서 서로 이어진 단지가 몇개 있는지 찾는 문제로, 이와 비슷한 문제를 이전에 풀어본 경험이 있어서 쉽게 풀 수 있었다.
먼저 2차원배열을 잘 입력받아서
map
이라는 배열에 넣어줬고,visited
라는 2차원boolean
배열을 만들어 주었다.이 후, 1이 있는 위치를 돌면서 bfs 함수에 넣어준다. 이 때 visited 값이 true이면 이미 다른 이어진 부분에서 체크를 했다는 뜻이므로 bfs함수를 돌지 않는다.
for (int i = 0; i < N; i++) { for (int j = 0; j < N; j++) { if (map[i][j] != 0 && !visited[i][j]) { bfs(new Node(i, j)); } } }
bfs함수 내부에서는
Queue
를 만들어서 상, 하, 좌, 우를 탐색하여visited
값과map
값을 확인하여 서로 연결된 단지들을 찾아준다. 이때count
를 세어준다.이 후
Queue
가 비었을 때static
으로 선언해놓은 answer라는ArrayList
에 값을 추가해주었다.bfs함수
Queue<Node> queue = new LinkedList<>(); int count = 0; visited[node.x][node.y] = true; queue.add(node); while (!queue.isEmpty()) { count++; Node current = queue.poll(); for (int i = 0; i < 4; i++) { int nx = current.x + dx[i]; int ny = current.y + dy[i]; if (nx < 0 || ny < 0 || nx >= N || ny >= N) continue; if(visited[nx][ny]) continue; if(map[nx][ny] != 0){ visited[nx][ny] = true; queue.add(new Node(nx, ny)); } } } answer.add(count);
이 후
answer
의 size를 출력해주고, 오름차순으로 정렬한answer
의 원소들을 출력하여주었다.'프로그래밍 > 알고리즘' 카테고리의 다른 글
[ 알고리즘 ] 백준 1935번 후위표기식 2 (0) 2019.05.02 [ 알고리즘 ] 백준 1918번 후위표기식 (0) 2019.05.02 [알고리즘] 알고스팟 소풍 PICNIC (0) 2019.03.22 [알고리즘] 알고스팟 BOARDCOVER 게임판 덮기 문제 (0) 2019.03.22 [알고리즘] DP 다이내믹 프로그래밍 Dynamic Programming (0) 2019.01.09