![[java] 백준 2667번 문제(단지번호붙이기)](https://img1.daumcdn.net/thumb/R750x0/?scode=mtistory2&fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FdquY9k%2FbtsNwoENbcm%2FyakZng0JKhJV3i4fsmyWik%2Fimg.png)
[java] 백준 2667번 문제(단지번호붙이기)자료구조 & 알고리즘/BOJ2025. 4. 23. 10:52
Table of Contents
원본 링크 : https://www.acmicpc.net/problem/2667
문제설명
소스코드
import java.io.BufferedReader;
import java.io.InputStreamReader;
import java.util.*;
public class Main
{
static int n;
static int[][] map; // 지도
static boolean[][] visited; // 방문 배열
public static void main(String[] args) throws Exception
{
BufferedReader br = new BufferedReader(new InputStreamReader(System.in));
ArrayList<Integer> answer = new ArrayList<>();
n = Integer.parseInt(br.readLine());
map = new int[n][n];
visited = new boolean[n][n];
for(int y = 0; y < n; ++y)
{
char[] charArray = br.readLine().toCharArray();
for(int x = 0; x < n; ++x) map[y][x] = Character.getNumericValue(charArray[x]);
}
for(int y = 0; y < n; ++y)
{
for(int x = 0; x < n; ++x)
{
if(!visited[y][x] && map[y][x] != 0) // 해당 좌표에 방문하지 않았고, 집이 없는 곳이 아니라면
answer.add(bfs(y,x)); // bfs를 호출하여 해당 아파트 단지 집의 수를 어레이 리스트에 추가
}
}
System.out.println(answer.size());
Collections.sort(answer); // 오름차순 정렬
for(int count : answer) System.out.println(count);
}
static int bfs(int startY, int startX)
{
int[] dy = {1, -1, 0, 0}; // 상, 하
int[] dx = {0, 0, -1, 1}; // 좌, 우
visited[startY][startX] = true; // 현재 좌표는 방문 표시
Queue<int[]> que = new LinkedList<>();
que.offer(new int[] {startY, startX});
int count = 1; // 현재 좌표를 방문했으므로 1부터 시작
while(!que.isEmpty())
{
int[] now = que.poll();
int nowY = now[0];
int nowX = now[1];
for(int i = 0; i < 4; ++i)
{
int nextY = nowY + dy[i];
int nextX = nowX + dx[i];
if(nextY < 0 || nextX < 0 || nextY >= n || nextX >= n) continue; // 좌표 유효성 검사
if(visited[nextY][nextX] || map[nextY][nextX] == 0) continue; // 이미 방문했거나, 집이 위치한 곳이 아니라면 pass
que.offer(new int[] {nextY, nextX}); // 큐에 삽입
visited[nextY][nextX] = true; // 방문 표시
++count; // 집의 수 증가
}
}
return count; // 해당 단지의 집의 수 리턴
}
}
설명
- BFS 사용
- 자세한 내용은 주석 참고
'자료구조 & 알고리즘 > BOJ' 카테고리의 다른 글
[java] 백준 2644번 문제(촌수계산) (0) | 2025.04.22 |
---|---|
[java] 백준 1012번 문제(유기농 배추) (2) | 2025.04.21 |
[java] 백준 1325번 문제(효율적인 해킹) (0) | 2025.04.15 |
[java] 백준 18352번 문제(특정 거리의 도시 찾기) (1) | 2025.04.15 |
[java] 백준 1850번 문제(최대 공약수 구하기) (0) | 2025.04.11 |