알고리즘

백준 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);
    }
}