알고리즘
백준 14176번 현수막 (JAVA)
박카스마시며코딩
2021. 12. 12. 18:11
https://www.acmicpc.net/problem/14716
14716번: 현수막
혁진이의 생각대로 프로그램을 구현했을 때, 현수막에서 글자의 개수가 몇 개인지 출력하여라.
www.acmicpc.net
저는 visited배열을 통해 각 지점에 대한 방문체크를 하였습니다.
또한, dfs를 통해 계속 재귀적으로 들어가도록 구현하였습니다
package BOJ;
import java.io.BufferedReader;
import java.io.InputStreamReader;
import java.util.StringTokenizer;
import java.util.function.Function;
public class BOJ_14716 {
static int n,m;
static int map[][];
static boolean visited[][];
static int dy[] = {-1,0,1,0,-1,1,1,-1};
static int dx[] = {0,1,0,-1,1,1,-1,-1};
static void dfs(int y, int x){
visited[y][x] = true;
for(int i = 0 ; i < 8 ; i++){
int ny = y + dy[i];
int nx = x + dx[i];
if(nx >= 0 && nx < m && ny >= 0 && ny < n && !visited[ny][nx] && map[ny][nx] == 1){
dfs(ny,nx);
}
}
}
public static void main(String[] args) throws Exception {
BufferedReader br = new BufferedReader(new InputStreamReader(System.in));
StringTokenizer st = new StringTokenizer(br.readLine()," ");
Function<String,Integer> stoi = Integer::parseInt;
n = stoi.apply(st.nextToken());
m = stoi.apply(st.nextToken());
map = new int[n][m];
visited = new boolean[n][m];
for(int i = 0 ; i < n ; i++){
st = new StringTokenizer(br.readLine()," ");
for(int j = 0 ; j < m ; j++){
map[i][j] = stoi.apply(st.nextToken());
}
}
int result = 0;
for(int i = 0 ; i < n ; i++){
for(int j = 0 ; j < m ; j++){
if(!visited[i][j] && map[i][j] == 1){
result++;
dfs(i,j);
}
}
}
System.out.println(result);
}
}