-
[알고리즘] 백준 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