[백준 1012] 유기농 배추_ 자바Java
19595 단어 bojProblem SolvingProblem Solving
1. 문제
https://www.acmicpc.net/problem/1012
2. 풀이방법
- 땅을
ground[][]
2차원 boolean배열로 만들고, 배추가 있는 위치에만 true 값을 준다. - 땅을 한 칸씩 탐색한다.
2-1.area
: 배추가 모여있는 지역을 카운팅하기 위한 변수를 지정한다.
2-2. 배추가 심어져 있으면 dfs()로 탐색하며, area 변수를 하나 증가시킨다. - dfs()
- (상하좌우 방향에서) 배추가 발견되지 않을 때까지 dfs로 탐색한다.
- 방문한 곳은
ground[x][y]
값을 false로 변경
3. 코드
import java.io.BufferedReader;
import java.io.BufferedWriter;
import java.io.IOException;
import java.io.InputStreamReader;
import java.io.OutputStreamWriter;
import java.util.StringTokenizer;
/**
* BOJ1012 - 유기농 배추
* Memory: 13,404KB
* Time: 124ms
*/
public class BOJ1012 {
static int T, M, N, K;
static boolean[][] ground;
static int[] answer;
static int[] dx = { 0, 0, 1, -1 };
static int[] dy = { 1, -1, 0, 0 };
public static void main(String[] args) throws IOException {
BufferedReader in = new BufferedReader(new InputStreamReader(System.in));
BufferedWriter out = new BufferedWriter(new OutputStreamWriter(System.out));
StringBuilder sb = new StringBuilder();
T = Integer.parseInt(in.readLine());
for (int t = 0; t < T; t++) {
StringTokenizer st = new StringTokenizer(in.readLine(), " ");
M = Integer.parseInt(st.nextToken());
N = Integer.parseInt(st.nextToken());
K = Integer.parseInt(st.nextToken());
ground = new boolean[N][M];
// 배추 위치 표시하기
for(int i = 0; i < K; i++) {
st = new StringTokenizer(in.readLine(), " ");
int y = Integer.parseInt(st.nextToken());
int x = Integer.parseInt(st.nextToken());
ground[x][y]= true;
}
// 땅 한 칸씩 탐색
int area = 0; // area: 구역 개수를 나타내는 변수
for(int i = 0; i < N; i++) {
for(int j = 0; j < M; j++) {
if(ground[i][j]) { // 배추가 심어져있으면 dfs
dfs(i, j);
area++; // 구역하나 증가
}
}
}
sb.append(area).append("\n");
}
out.write(sb.toString());
out.close();
in.close();
}
/**
* dfs() - (상하좌우 방향에) 배추가 발견되지 않을 때까지 dfs로 탐색
*/
private static void dfs(int x, int y) {
// 방문한 곳은 false 처리
ground[x][y] = false;
// 상하좌우 탐색하면서 땅의 유효범위 내에 있고, 배추가 존재할 때 이동
for(int i =0; i < 4; i++) {
int nx = x + dx[i];
int ny = y + dy[i];
if(isValid(nx, ny) && ground[nx][ny]) {
dfs(nx, ny);
}
}
}
/**
* isValid() - 땅을 벗어났는지 아닌지 범위 체크하는 함수
*/
private static boolean isValid(int x, int y) {
return 0 <= x && x < N && 0 <= y && y < M;
}
}
Author And Source
이 문제에 관하여([백준 1012] 유기농 배추_ 자바Java), 우리는 이곳에서 더 많은 자료를 발견하고 링크를 클릭하여 보았다 https://velog.io/@yoonjy1106/백준-1012-유기농-배추-자바Java저자 귀속: 원작자 정보가 원작자 URL에 포함되어 있으며 저작권은 원작자 소유입니다.
우수한 개발자 콘텐츠 발견에 전념 (Collection and Share based on the CC Protocol.)