문제
https://www.acmicpc.net/problem/14716
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
0 1 0 0 0 1 0 1 0 0 1 1 0 0 0 1 0 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 |