티끌모아 태산

백준 2667번: 단지번호붙이기 본문

코딩/코딩테스트

백준 2667번: 단지번호붙이기

yesman9 2024. 6. 25. 17:39

그래프를 보는 순간, 전형적인 DFS, BFS문제 라는 것을 알 수 있다.

이 문제에서는 단지를 모두 찾아야 하므로 BFS, DFS모두 사용 가능하다.

나는 DFS가 사용하기 더 편했다.

import java.io.BufferedReader;
import java.io.BufferedWriter;
import java.io.IOException;
import java.io.InputStreamReader;
import java.io.OutputStreamWriter;
import java.util.ArrayList;
import java.util.Collections;
import java.util.List;
import java.util.StringTokenizer;

public class Main {
	static String[][] map;
	static boolean[][] visited;
	static int n;
	static int houseCnt;

	public static void main(String[] args) throws IOException {
		BufferedReader br = new BufferedReader(new InputStreamReader(System.in));
		BufferedWriter bw = new BufferedWriter(new OutputStreamWriter(System.out));

		// 입력
		StringTokenizer st = new StringTokenizer(br.readLine());
		n = Integer.parseInt(st.nextToken());
		map = new String[n][n];
		visited = new boolean[n][n];
		// 지도 입력
		for (int i = 0; i < n; i++) {
			String line = br.readLine();
			for (int j = 0; j < n; j++) {
				map[i][j] = line.substring(j, j + 1);
			}
		}

		// 지도 탐색
		List<Integer> villages = new ArrayList<Integer>();
		for (int i = 0; i < n; i++) {
			for (int j = 0; j < n; j++) {
				// 새로운 단지를 찾으면 dfs 시작
				if (map[i][j].equals("1") && !visited[i][j]) {
					houseCnt = 0;
					dfs(i, j);
					villages.add(houseCnt);

				}
			}
		}

		// 오름차순 정렬
		Collections.sort(villages);

		// 출력문 생성
		StringBuffer sb = new StringBuffer();
		sb.append(villages.size());
		for (int i : villages) {
			sb.append("\n" + i);
		}

		// 출력
		bw.write(sb.toString());
		bw.flush();
		bw.close();
		br.close();
	}

	static void dfs(int a, int b) {
		visited[a][b] = true;
		houseCnt++;
		if (a + 1 < n && !visited[a + 1][b] && map[a + 1][b].equals("1")) {
			dfs(a + 1, b);
		}
		if (a - 1 >= 0 && !visited[a - 1][b] && map[a - 1][b].equals("1")) {
			dfs(a - 1, b);
		}
		if (b + 1 < n && !visited[a][b + 1] && map[a][b + 1].equals("1")) {
			dfs(a, b + 1);
		}
		if (b - 1 >= 0 && !visited[a][b - 1] && map[a][b - 1].equals("1")) {
			dfs(a, b - 1);
		}

	}
}

dfs 메소드 내 if문에서 그래프의 범위를 잘 체크하자

'코딩 > 코딩테스트' 카테고리의 다른 글

백준 6064번: 카잉 달력  (0) 2024.07.02
백준 5525번: IOIOI  (0) 2024.06.25
백준 2178번: 미로 탐색  (0) 2024.06.18
백준 1931번: 회의실 배정  (0) 2024.06.18
백준 1389번: 케빈 베이컨의 6단계 법칙  (0) 2024.06.11