출처 : https://www.acmicpc.net/problem/14716
문제
ANT가 처음 알고리즘 대회를 개최하게 되면서 현수막을 내걸었다.
저번 학기 영상처리 수업을 듣고 배웠던 지식을 최대한 응용 해보고 싶은 혁진이는 이 현수막에서 글자가 몇 개인지 알아보는 프로그램을 만들려 한다.
혁진이는 우선 현수막에서 글자인 부분은 1, 글자가 아닌 부분은 0으로 바꾸는 필터를 적용하여 값을 만드는데 성공했다.
그런데 혁진이는 이 값을 바탕으로 글자인 부분 1이 상, 하, 좌, 우, 대각선으로 인접하여 서로 연결되어 있다면 한 개의 글자라고 생각만 하였다.
혁진이가 필터를 적용하여 만든 값이 입력으로 주어졌을 때, 혁진이의 생각대로 프로그램을 구현하면 글자의 개수가 몇 개인지 출력하여라.
입력
첫 번째 줄에는 현수막의 크기인 M와 N가 주어진다. (1 ≤ M, N ≤ 250)
두 번째 줄부터 M+1 번째 줄까지 현수막의 정보가 1과 0으로 주어지며, 1과 0을 제외한 입력은 주어지지 않는다.
출력
혁진이의 생각대로 프로그램을 구현했을 때, 현수막에서 글자의 개수가 몇 개인지 출력하여라.
풀이방법
- BFS 를 통해 인접한 글자 ( 1 ) 를 모두 방문. 하고 0 ( 방문처리 ) 으로 바꿔 주었다.
- 처음부터 끝까지 탐색하며 , 1을 처음 만날 때 answer++ 하고 인접한 글자 수 모두 방문처리 후 계속진행
느낀점
- 그 동안 몇문제 풀었다고 이런 류의 문제는 좀 괜찮아졌지만 , 모든 경우의 수 중에 최적의 해 구하는 문제는 어렵다.
코드
package 알고리즘스터디문제;
import java.awt.Point;
import java.util.LinkedList;
import java.util.Queue;
import java.util.Scanner;
public class 현수막_14716 {
static int[] dr = {-1, -1, 0, 1, 1, 1, 0, -1 };
static int[] dc = {0, 1, 1, 1, 0, -1, -1, -1 };
static int M, N;
static int[][] map ;
static int answer =0;
static Queue<Point> queue ;
static void bfs() {
while ( !queue.isEmpty()) {
Point p = queue.poll();
for ( int d=0; d<8; d++) {
int nr = p.x + dr[d];
int nc = p.y + dc[d];
if ( nr <0 || nr >= M || nc <0 || nc >= N || map[nr][nc] == 0 ) continue; // 경계 벗어나거나 글자 아니면 넘어가자
map[nr][nc] = 0; // 방문처리
queue.add(new Point(nr,nc));
}
}
}
public static void main(String[] args) {
Scanner sc = new Scanner(System.in);
queue = new LinkedList<>();
M = sc.nextInt();
N = sc.nextInt();
map = new int[M][N];
for ( int i=0; i<M; i++) {
for ( int j=0; j<N; j++) {
map[i][j] = sc.nextInt();
}
}
for ( int i=0; i< M; i++) {
for ( int j=0; j<N; j++) {
if ( map[i][j] == 1 ) { // 글자를 발견하면
answer ++; // 하나 찾았다!
queue.add(new Point(i,j)); // 큐에 추가하고
bfs();
}
}
}
System.out.println(answer);
}
}
'알고리즘' 카테고리의 다른 글
[백준] 벽 부수고 이동하기 2206 [ JAVA ] (0) | 2020.08.29 |
---|---|
[백준] 점프왕 쪨리 16174 ( JAVA ) (0) | 2020.08.29 |
[백준] 나이트의 이동 7562 [ Java ] (0) | 2020.08.28 |
[백준] 스타트와 링크 14889 [JAVA] (0) | 2020.08.28 |
[백준] 빵집 3109 [ Java ] (0) | 2020.08.27 |