백준 14716: 현수막 [Java] - 포포
2022. 5. 7. 20:33ㆍ알고리즘/BFS 알고리즘
문제
ANT가 처음 알고리즘 대회를 개최하게 되면서 현수막을 내걸었다.
저번 학기 영상처리 수업을 듣고 배웠던 지식을 최대한 응용 해보고 싶은 혁진이는 이 현수막에서 글자가 몇 개인지 알아보는 프로그램을 만들려 한다.
혁진이는 우선 현수막에서 글자인 부분은 1, 글자가 아닌 부분은 0으로 바꾸는 필터를 적용하여 값을 만드는데 성공했다.
그런데 혁진이는 이 값을 바탕으로 글자인 부분 1이 상, 하, 좌, 우, 대각선으로 인접하여 서로 연결되어 있다면 한 개의 글자라고 생각만 하였다.
혁진이가 필터를 적용하여 만든 값이 입력으로 주어졌을 때, 혁진이의 생각대로 프로그램을 구현하면 글자의 개수가 몇 개인지 출력하여라.
입력
첫 번째 줄에는 현수막의 크기인 M와 N가 주어진다. (1 ≤ M, N ≤ 250)
두 번째 줄부터 M+1 번째 줄까지 현수막의 정보가 1과 0으로 주어지며, 1과 0을 제외한 입력은 주어지지 않는다.
출력
혁진이의 생각대로 프로그램을 구현했을 때, 현수막에서 글자의 개수가 몇 개인지 출력하여라.
내 제출
public class No14716 {
static int[][] arr;
static boolean[][] visit;
static Queue<Point> qu;
static int[] dx = {1, 1, 1, 0, 0, -1, -1, -1};
static int[] dy = {1, 0, -1, 1, -1, -1, 0, 1};
static int count;
static int n, m;
public static void main(String[] args) throws IOException {
BufferedReader br = new BufferedReader(new InputStreamReader(System.in));
StringTokenizer st = new StringTokenizer(br.readLine());
n = Integer.parseInt(st.nextToken(" "));
m = Integer.parseInt(st.nextToken(" "));
arr = new int[n][m];
visit = new boolean[n][m];
qu = new LinkedList<>();
for (int i = 0; i < n; i++) {
st = new StringTokenizer(br.readLine());
for (int j = 0; j < m; j++) {
arr[i][j] = Integer.parseInt(st.nextToken(" "));
}
}
for (int i = 0; i < n; i++) {
for (int j = 0; j < m; j++) {
if(arr[i][j] == 1 && !visit[i][j]){
bfs(new Point(i, j));
count++;
}
}
}
System.out.println(count);
}
private static void bfs(Point point) {
qu.offer(point);
visit[point.x][point.y] = true;
while (!qu.isEmpty()) {
Point p = qu.poll();
for(int i =0; i<8; i++){
int nx = p.x+ dx[i];
int ny = p.y+ dy[i];
if(nx<0 || ny<0 || nx>=n || ny>=m) continue;
if(arr[nx][ny] == 1 && !visit[nx][ny]){
qu.offer(new Point(nx, ny));
visit[nx][ny] = true;
}
}
}
}
static class Point{
int x;
int y;
public Point(int x, int y) {
this.x = x;
this.y = y;
}
}
}
단순한 bfs문제였다.
배열을 탐색하면서 1(텍스트)를 발견하면 bfs를 실행하여
총 텍스트의 개수를 출력하는 문제다.
'알고리즘 > BFS 알고리즘' 카테고리의 다른 글
백준 12716: 돌다리 [Java] - 포포 (0) | 2022.05.17 |
---|---|
백준 1388: 바닥 장식 [Java] - 포포 (0) | 2022.05.16 |
백준 3187: 양치기 꿍 [Java] - 포포 (0) | 2022.05.06 |
백준 16948: 데스 나이트 [Java] - 포포 (0) | 2022.05.05 |
백준 4963: 섬의 개수 (0) | 2022.04.26 |