티스토리 뷰
1. 문제
https://www.acmicpc.net/problem/1012
2. 설명
앞에서 계속 풀어왔던 dfs bfs 기본 문제!
3차원 배열쓰고 나머지는 똑같이 풀었다.
이제 응용문제 풀어봐야징
3-1. dfs 코드
import java.io.BufferedReader;
import java.io.IOException;
import java.io.InputStreamReader;
import java.util.StringTokenizer;
public class Main {
static int[] goX = {-1, 1, 0, 0};
static int[] goY = {0, 0, -1, 1};
static void dfs(int T, int x, int y, int[][][] cabbage) {
if(cabbage[T][x][y]==0) return;
cabbage[T][x][y] = 0;
for(int i=0; i<4; i++) {
int nx = x + goX[i];
int ny = y + goY[i];
if(0<=nx && nx<cabbage[T].length && 0<=ny && ny<cabbage[T][0].length) {
dfs(T,nx,ny,cabbage);
}
}
}
public static void main(String[] args) throws IOException {
BufferedReader br = new BufferedReader(new InputStreamReader(System.in));
int T = Integer.parseInt(br.readLine()); // testcase 수
int[][][] cabbage = new int[T][][]; // 가변 배열
for(int i=0; i<T; i++) {
StringTokenizer st = new StringTokenizer(br.readLine());
int M = Integer.parseInt(st.nextToken()); // 가로
int N = Integer.parseInt(st.nextToken()); // 세로
int K = Integer.parseInt(st.nextToken()); // 배추 위치 개수
cabbage[i] = new int[M][N]; // 가로 세로에 맞춰 다시 메모리 생성
for(int j=0; j<K; j++) {
st = new StringTokenizer(br.readLine());
int c1 = Integer.parseInt(st.nextToken());
int c2 = Integer.parseInt(st.nextToken());
cabbage[i][c1][c2] = 1; // 배추
}
}
for(int i=0; i<T; i++) {
int cnt = 0; // 배추 수 저장
for(int j=0; j<cabbage[i].length; j++) { // 가로
for(int k=0; k<cabbage[i][0].length; k++) { // 세로
if(cabbage[i][j][k]==1) {
dfs(i,j,k,cabbage);
cnt++;
}
}
}
System.out.println(cnt);
}
}
}
3-2. bfs 코드
import java.io.BufferedReader;
import java.io.IOException;
import java.io.InputStreamReader;
import java.util.LinkedList;
import java.util.Queue;
import java.util.StringTokenizer;
public class Main {
static int[] goX = {-1, 1, 0, 0};
static int[] goY = {0, 0, -1, 1};
static void bfs(int T, int x, int y, int[][][] cabbage) {
Queue<int[]> q = new LinkedList<int[]>();
q.add(new int[] {x,y});
cabbage[T][x][y] = 0;
while(!q.isEmpty()) {
int curX = q.peek()[0];
int curY = q.peek()[1];
q.poll();
for(int i=0; i<4; i++) {
int nx = curX + goX[i];
int ny = curY + goY[i];
if(0<=nx && nx<cabbage[T].length && 0<=ny && ny<cabbage[T][0].length) {
if(cabbage[T][nx][ny] == 1) {
q.add(new int[] {nx,ny});
cabbage[T][nx][ny] = 0;
}
}
}
}
}
public static void main(String[] args) throws IOException {
BufferedReader br = new BufferedReader(new InputStreamReader(System.in));
int T = Integer.parseInt(br.readLine()); // testcase 수
int[][][] cabbage = new int[T][][]; // 가변 배열
for(int i=0; i<T; i++) {
StringTokenizer st = new StringTokenizer(br.readLine());
int M = Integer.parseInt(st.nextToken()); // 가로
int N = Integer.parseInt(st.nextToken()); // 세로
int K = Integer.parseInt(st.nextToken()); // 배추 위치 개수
cabbage[i] = new int[M][N]; // 가로 세로에 맞춰 다시 메모리 생성
for(int j=0; j<K; j++) {
st = new StringTokenizer(br.readLine());
int c1 = Integer.parseInt(st.nextToken());
int c2 = Integer.parseInt(st.nextToken());
cabbage[i][c1][c2] = 1; // 배추
}
}
for(int i=0; i<T; i++) {
int cnt = 0; // 배추 수 저장
for(int j=0; j<cabbage[i].length; j++) { // 가로
for(int k=0; k<cabbage[i][0].length; k++) { // 세로
if(cabbage[i][j][k] == 1) {
bfs(i,j,k,cabbage);
cnt++;
}
}
}
System.out.println(cnt);
}
}
}
'알고리즘 풀이 > 백준' 카테고리의 다른 글
백준 7576 토마토 (BFS) (0) | 2020.04.20 |
---|---|
백준 2178 미로 탐색 (BFS) (0) | 2020.04.17 |
백준 2667번: 단지번호붙이기 (DFS,BFS) (0) | 2020.04.14 |
백준 2606번: 바이러스 (DFS,BFS) (0) | 2020.04.09 |
백준 1260번: DFS와 BFS (0) | 2020.04.07 |
댓글
공지사항
최근에 올라온 글
최근에 달린 댓글
- Total
- Today
- Yesterday