💡Problem Solving/BOJ

[BOJ 14716] 현수막 (Java)

gom20 2021. 12. 9. 12:05

문제

https://www.acmicpc.net/problem/14716

 

14716번: 현수막

혁진이의 생각대로 프로그램을 구현했을 때, 현수막에서 글자의 개수가 몇 개인지 출력하여라.

www.acmicpc.net

8 19
0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
0 0 0 1 0 0 0 1 0 0 0 1 0 1 1 1 1 1 0
0 0 1 0 1 0 0 1 1 0 0 1 0 0 0 1 0 0 0
0 1 0 0 0 1 0 1 0 1 0 1 0 0 0 1 0 0 0
0 1 1 1 1 1 0 1 0 1 0 1 0 0 0 1 0 0 0
1 0 0 0 1 0 1 0 0 1 1 0 0 0 1 0 0 0
1 0 0 0 1 0 1 0 0 0 1 0 0 0 1 0 0 0
0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0

풀이

쉬운 문제이다. 

이중 for문으로 맵을 순회하면서 1값이 나왔을 때 글자의 개수를 증가시킨다.

그리고 해당 좌표부터 상, 하, 좌, 우, 대각선으로 DFS를 하면서 0으로 갱신한다.

 

소스코드

package dfs;

import java.io.BufferedReader;
import java.io.InputStreamReader;
import java.util.StringTokenizer;

public class BOJ14716 {
    public static int[][] arr;
    // 상 하 좌 우 대각선
    public static int[][] dir = new int[][]{{1, 0}, {-1, 0}, {0, 1}, {0, -1}, {1, 1}, {-1, -1}, {1, -1}, {-1, 1}};
    public static void main(String[] args) throws Exception {
        BufferedReader br = new BufferedReader(new InputStreamReader(System.in));
        StringTokenizer st = new StringTokenizer(br.readLine());
        int N = Integer.parseInt(st.nextToken());
        int M = Integer.parseInt(st.nextToken());

        arr = new int[N][M];
        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());
            }
        }

        int answer = 0;
        for(int i = 0; i < N; i++){
            for(int j = 0; j < M; j++){
                if(arr[i][j] == 1){
                    answer++;
                    dfs(i, j);
                }
            }
        }
        System.out.println(answer);
    }

    public static void dfs(int i, int j){
        arr[i][j] = 0;
        for(int[] d : dir){
            int nx = i + d[0];
            int ny = j + d[1];
            if(isValid(nx, ny)){
                dfs(nx, ny);
            }
        }
    }

    public static boolean isValid(int x, int y){
        if(x < 0 || y < 0 || x >= arr.length || y >= arr[0].length) return false;
        if(arr[x][y] == 0) return false;
        return true;
    }
}

'💡Problem Solving > BOJ' 카테고리의 다른 글

[BOJ 15686] 치킨 배달 (Java, Python)  (0) 2021.12.10
[BOJ 10217] KCM Travel (Java)  (0) 2021.12.09
[BOJ 2170] 선 긋기 (Java)  (0) 2021.12.08
[BOJ 5419] 북서풍 (Java)  (0) 2021.12.07
[BOJ 2357] 최솟값과 최댓값 (Java)  (0) 2021.12.06