๋ชฉ์ฐจ
https://www.acmicpc.net/problem/1012
๋ฌธ์ ํ์ด
์ธ์ ํ ์ขํ๊ฐ ์ฐ๊ฒฐ๋์ด ์๋์ง ์ฒดํฌํ๋ ๋ฌธ์ ์ด๋ค.
์ธ์ ํ๋คํด์ bfs, dfs๊ฐ ๋ ์ฌ๋๊ณ ,
์ํ์ข์ฐ๋ก ์ด๋ํ ์ ์๋คํด์ dx, dy์ ๋ํ ๋ด์ฉ์ด ๋ ์ฌ๋๋ค
์ผ๋ฐ์ ์ธ bfs, dfs๋ ์๋ ์ฌ์ง์ฒ๋ผ 1๋ฒ์์ ์์ํ๋ฉด ์ฐ๊ฒฐ๋ 9๋ฒ๊น์ง ๋์ฐฉํ ์ ์์๋ค.
๋ฌธ์ ์ bfs, dfs๋ฅผ ๊ทธ๋๋ก ์ ์ฉํ๋ฉด ์ด๋ป๊ฒ๋ ๊น?
(0,0)์์ ์์ํ๋ค ํ์ ๋ (1,1)๊น์ง๋ง ์ฐ๊ฒฐ๋์ด์๊ธฐ๋๋ฌธ์ ๋๋จธ์ง๋ ํ์ํ์ง ๋ชปํ๊ณ ๋๋๋ฒ๋ฆฐ๋ค!
๊ทธ๋์ bfs, dfs๋ฅผ ๋ฐ๋ณต๋ฌธ์์ ๋ฃ์ด์, ์์์ขํ๋ฅผ ๋ค์ ์ ํ ํด์ฃผ์ด์ผํ๋ค.
์ง๋ ์ด์ ์๋ ์ด ๋ฐ๋ณต๋ฌธ ์์ ๋ฃ์ด์ ์ฒดํฌํด์ฃผ์.
int count=0; //ํ
์คํธ ์ผ์ด์ค๋ง๋ค ์ง๋ ์ด์ ๊ฐ์๋ฅผ ์ธ์ผํ๋ค
//bfs์ ์์์ขํ๋ฅผ ์
ํ
ํด์ ๋ค๋ฅธ ๊ณณ์ ๋ชจ์ฌ์๋ ๋ฐฐ์ถ๋ค๋ ํ์
ํ ์ ์๊ฒํ๋ค
//๊ฐ๋ก ์ธ๋ก ์ขํ๋ค์ ํ๋์ฉ ์
๋ ฅํด์ฃผ๊ณ
for (int j = 0; j < weight; j++) {
for (int k = 0; k < height; k++) {
//์ขํ์ ๋ฐฐ์ถ๊ฐ ์๋์ง ํ์ธ, ๋ด๊ฐ ์ฒดํฌ์ํ ๊ณณ์ธ์ง ํ์ธํ๋ค
if(ground[j][k] == 1 && !check[j][k]){
//๋ฐฐ์ถ๊ฐ ์๊ณ ์ฒดํฌ์๋ ์ขํ์์๋ถํฐ bfs๋ก ์ฐ๊ฒฐ๋ ๊ณณ์ ํ์
ํ๋ค
bfs(j, k); or dfs(j,k);
//์ง๋ ์ด์ ๊ฐ์๋ ์ธ์ ํ ๊ณณ๋ง๋ค 1๊ฐ์ฉ์ด๋ค.
//์ธ์ ํ ๊ณณ์ ๋ชจ๋ ํ์
ํ์ผ๋ฉด ์ง๋ ์ด๋ฅผ ํ๋ง๋ฆฌ ๋๋๋ค.
count++;
}
}
}
๊ทธ๋ฆผ์ผ๋ก ๋ณด๋ ํ์ด(bfs, dfs)
- j= 0, k= 0์ผ๋
=> bfs(0,0)
=> bfs๋ฉ์๋ ์์์ ์ธ์ ์ขํ ํ์ (์๋ ๊ทธ๋ฆผ ์ฐธ๊ณ )
=> dfs(0,0)
=> dfs๋ฉ์๋ ์์์ ์ธ์ ์ขํ ํ์ (์๋ ๊ทธ๋ฆผ ์ฐธ๊ณ )
- j= 0, k= 1์ผ๋ => ground[0][1] = 0 ์ด๋ฏ๋ก ํจ์ค
- j= 0, k= 2์ผ๋ => ground[0][1] = 0 ์ด๋ฏ๋ก ํจ์ค
....
- j= 1, k= 0์ผ๋ => check[1][0] = true ์ด๋ฏ๋ก ํจ์ค
- j= 1, k= 1์ผ๋ => check[1][1] = true ์ด๋ฏ๋ก ํจ์ค
- j= 1, k= 2์ผ๋ => ground[1][2] = 0 ์ด๋ฏ๋ก ํจ์ค
....
- j= 2, k= 3์ผ๋ => ground[2][3] = 0 ์ด๋ฏ๋ก ํจ์ค
- j= 2, k= 4์ผ๋
=> bfs(2,4)
=> bfs๋ฉ์๋ ์์์ ์ธ์ ์ขํ ํ์ (์๋ ๊ทธ๋ฆผ ์ฐธ๊ณ )
=> dfs(2,4)
=> dfs๋ฉ์๋ ์์์ ์ธ์ ์ขํ ํ์ (์๋ ๊ทธ๋ฆผ ์ฐธ๊ณ )
... ๊ณ์ ๋ฐ๋ณต
์ ์ถ์ฝ๋
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[][] ground; //2์ฐจ์ ๋ฐฐ์ด๋ก ๋ฐฐ์ถ๋ฐญ์ ํํํ๋ค
static boolean[][] check; //2์ฐจ์ ๋ฐฐ์ด๋ก ๋ฐฐ์ถ๊ฐ ์๋ ๊ณณ์ ์ฒดํฌํ๋ค
static int weight; //๋ฐฐ์ถ๋ฐญ์ ๊ฐ๋ก
static int height; //๋ฐฐ์ถ๋ฐญ์ ์ธ๋ก
public static void main(String[] args) throws IOException {
BufferedReader br = new BufferedReader(new InputStreamReader(System.in));
int T = Integer.parseInt(br.readLine());
StringTokenizer st;
for (int i = 0; i < T; i++) {
st = new StringTokenizer(br.readLine(), " ");
weight = Integer.parseInt(st.nextToken());
height = Integer.parseInt(st.nextToken());
ground = new int[weight][height];
check = new boolean[weight][height];
int K = Integer.parseInt(st.nextToken());
for (int j = 0; j < K; j++) {
st = new StringTokenizer(br.readLine(), " ");
int x = Integer.parseInt(st.nextToken());
int y = Integer.parseInt(st.nextToken());
ground[x][y] = 1; //๋ฐฐ์ถ ์ขํ ์
๋ ฅ
}
//===========================================================
//์ฌ๊ธฐ๊น์ง๋ ์
๋ ฅ๋ ๋ด์ฉ ์ ์ฅํ๋ ๋ด์ฉ์ด๋ค.
int count=0; //ํ
์คํธ ์ผ์ด์ค๋ง๋ค ์ง๋ ์ด์ ๊ฐ์๋ฅผ ์ธ์ผํ๋ค
//bfs์ ์์์ขํ๋ฅผ ์
ํ
ํด์ ๋ค๋ฅธ ๊ณณ์ ๋ชจ์ฌ์๋ ๋ฐฐ์ถ๋ค๋ ํ์
ํ ์ ์๊ฒํ๋ค
//๊ฐ๋ก ์ธ๋ก ์ขํ๋ค์ ํ๋์ฉ ์
๋ ฅํด์ฃผ๊ณ
for (int j = 0; j < weight; j++) {
for (int k = 0; k < height; k++) {
//์ขํ์ ๋ฐฐ์ถ๊ฐ ์๋์ง ํ์ธ, ๋ด๊ฐ ์ฒดํฌ์ํ ๊ณณ์ธ์ง ํ์ธํ๋ค
if(ground[j][k] == 1 && !check[j][k]){
//๋ฐฐ์ถ๊ฐ ์๊ณ ์ฒดํฌ์๋ ์ขํ์์๋ถํฐ bfs๋ก ์ฐ๊ฒฐ๋ ๊ณณ์ ํ์
ํ๋ค
bfs(j, k);
//์ง๋ ์ด์ ๊ฐ์๋ ์ธ์ ํ ๊ณณ๋ง๋ค 1๊ฐ์ฉ์ด๋ค.
//์ธ์ ํ ๊ณณ์ ๋ชจ๋ ํ์
ํ์ผ๋ฉด ์ง๋ ์ด๋ฅผ ํ๋ง๋ฆฌ ๋๋๋ค.
count++;
}
}
}
System.out.println(count);
}
}
private static void bfs(int startX, int startY) {
Queue<int[]> queue = new LinkedList<>();
//bfs์์ queue์ ์ญํ ์ ๋ค์ ํ์ํ ์ขํ๋ฅผ ๋ฏธ๋ฆฌ ์ ์ฅํด ๋๋ ๊ฒ์ด๋ค.
//bfs 1๋ฒ ์คํ๋ ๋๋ง๋ค ์ธ์ ํ ๊ณณ์ ๋ชจ๋ ํ์ํ๊ณ ์ข
๋ฃ๋๋ bfs์์ queue๋ฅผ ์ ์ธํ๋ค.
queue.offer(new int[] {startX, startY});
//x, y์ขํ ์ ์ฅ
check[startX][startY] = true;
//์์์ขํ์ ๋ฐฐ์ถ๊ฐ ์์ผ๋ ๋ฏธ๋ฆฌ true๋ก ์ฒ๋ฆฌํด์ค๋ค.
int[] X = {0, 0, -1, +1};
int[] Y = {-1, +1, 0, 0};
//๋ฐฐ์ถ๊ฐ ์ํ์ข์ฐ์ ์ธ์ ํ๋ฉด ์ด๋ํ ์ ์๋ค.
//ํ์ฌ์ขํ์์ ์ํ์ข์ฐ ์์ง์ด๋ ์ขํ๋ฅผ ์ง์ ํ๋ค.
//queue๊ฐ ๋น์ด์์ผ๋ฉด ๋์ด์ ์ธ์ ํ ๋ฐฐ์ถ๊ฐ ์๋ค๋ ๋ป์ด๋ค.
while(!queue.isEmpty()){
int[] poll = queue.poll();
//์ ์ฅ๋ queue๋ฅผ ๊บผ๋ธ๋ค
//์ํ์ข์ฐ 4๊ฐ์ง ๋ฐฉ๋ฒ์ด๋ for๋ฌธ 4๋ฒ ๋ฐ๋ณต
for (int i = 0; i < 4; i++) {
int x = poll[0] + X[i];
int y = poll[1] + Y[i];
//์ํ์ข์ฐ ์ขํ ์กฐ์
//์ขํ๊ฐ ๋ฐฐ์ถ๋ฐญ์ ๋ฒ์ด๋๊ฒ๋๋ฉด ๋ค์ ์ขํ๋ฅผ ์ฒดํฌํด์ผํ๋ค
if(x < 0 || x >= weight || y < 0 || y >= height){
continue;
}
//์ํ์ข์ฐ ์์ง์ธ ์ขํ์ ๋ฐฐ์ถ๊ฐ ์๊ณ , ์ฒดํฌํ์ง ์์ ์ขํ์ด๋ฉด
if(ground[x][y] == 1 & !check[x][y]){
queue.offer(new int[] {x, y});
//์ขํ๋ฅผ ์ ์ฅํ๋ค.
check[x][y] = true;
//์ฒดํฌํ๋ค
}
}
}
}
}
DFS์ฌ์ฉ
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[][] ground; //2์ฐจ์ ๋ฐฐ์ด๋ก ๋ฐฐ์ถ๋ฐญ์ ํํํ๋ค
static boolean[][] check; //2์ฐจ์ ๋ฐฐ์ด๋ก ๋ฐฐ์ถ๊ฐ ์๋ ๊ณณ์ ์ฒดํฌํ๋ค
static int weight; //๋ฐฐ์ถ๋ฐญ์ ๊ฐ๋ก
static int height; //๋ฐฐ์ถ๋ฐญ์ ์ธ๋ก
public static void main(String[] args) throws IOException {
BufferedReader br = new BufferedReader(new InputStreamReader(System.in));
int T = Integer.parseInt(br.readLine());
StringTokenizer st;
for (int i = 0; i < T; i++) {
st = new StringTokenizer(br.readLine(), " ");
weight = Integer.parseInt(st.nextToken());
height = Integer.parseInt(st.nextToken());
ground = new int[weight][height];
check = new boolean[weight][height];
int K = Integer.parseInt(st.nextToken());
for (int j = 0; j < K; j++) {
st = new StringTokenizer(br.readLine(), " ");
int x = Integer.parseInt(st.nextToken());
int y = Integer.parseInt(st.nextToken());
ground[x][y] = 1; //๋ฐฐ์ถ ์ขํ ์
๋ ฅ
}
//===========================================================
//์ฌ๊ธฐ๊น์ง๋ ์
๋ ฅ๋ ๋ด์ฉ ์ ์ฅํ๋ ๋ด์ฉ์ด๋ค.
int count=0; //ํ
์คํธ ์ผ์ด์ค๋ง๋ค ์ง๋ ์ด์ ๊ฐ์๋ฅผ ์ธ์ผํ๋ค
//bfs์ ์์์ขํ๋ฅผ ์
ํ
ํด์ ๋ค๋ฅธ ๊ณณ์ ๋ชจ์ฌ์๋ ๋ฐฐ์ถ๋ค๋ ํ์
ํ ์ ์๊ฒํ๋ค
//๊ฐ๋ก ์ธ๋ก ์ขํ๋ค์ ํ๋์ฉ ์
๋ ฅํด์ฃผ๊ณ
for (int j = 0; j < weight; j++) {
for (int k = 0; k < height; k++) {
//์ขํ์ ๋ฐฐ์ถ๊ฐ ์๋์ง ํ์ธ, ๋ด๊ฐ ์ฒดํฌ์ํ ๊ณณ์ธ์ง ํ์ธํ๋ค
if(ground[j][k] == 1 && !check[j][k]){
//๋ฐฐ์ถ๊ฐ ์๊ณ ์ฒดํฌ์๋ ์ขํ์์๋ถํฐ dfs๋ก ์ฐ๊ฒฐ๋ ๊ณณ์ ํ์
ํ๋ค
dfs(j, k);
//์ง๋ ์ด์ ๊ฐ์๋ ์ธ์ ํ ๊ณณ๋ง๋ค 1๊ฐ์ฉ์ด๋ค.
//์ธ์ ํ ๊ณณ์ ๋ชจ๋ ํ์
ํ์ผ๋ฉด ์ง๋ ์ด๋ฅผ ํ๋ง๋ฆฌ ๋๋๋ค.
count++;
}
}
}
System.out.println(count);
}
}
private static void dfs(int startX, int startY) {
check[startX][startY] = true;
//์์์ขํ์ ๋ฐฐ์ถ๊ฐ ์์ผ๋ ๋ฏธ๋ฆฌ true๋ก ์ฒ๋ฆฌํด์ค๋ค.
int[] X = {0, 0, -1, +1};
int[] Y = {-1, +1, 0, 0};
//๋ฐฐ์ถ๊ฐ ์ํ์ข์ฐ์ ์ธ์ ํ๋ฉด ์ด๋ํ ์ ์๋ค.
//ํ์ฌ์ขํ์์ ์ํ์ข์ฐ ์์ง์ด๋ ์ขํ๋ฅผ ์ง์ ํ๋ค.
//์ํ์ข์ฐ 4๊ฐ์ง ๋ฐฉ๋ฒ์ด๋ for๋ฌธ 4๋ฒ ๋ฐ๋ณต
for (int i = 0; i < 4; i++) {
int x = startX + X[i];
int y = startY + Y[i];
//์ํ์ข์ฐ ์ขํ ์กฐ์
//์ขํ๊ฐ ๋ฐฐ์ถ๋ฐญ์ ๋ฒ์ด๋๊ฒ๋๋ฉด ๋ค์ ์ขํ๋ฅผ ์ฒดํฌํด์ผํ๋ค
if(x < 0 || x >= weight || y < 0 || y >= height){
continue;
}
//์ํ์ข์ฐ ์์ง์ธ ์ขํ์ ๋ฐฐ์ถ๊ฐ ์๊ณ , ์ฒดํฌํ์ง ์์ ์ขํ์ด๋ฉด
if(ground[x][y] == 1 & !check[x][y]){
dfs(x, y); //ํด๋น ์ขํ๋ก dfs ์คํ
}
}
}
}
'๐ฏ Coding Test' ์นดํ ๊ณ ๋ฆฌ์ ๋ค๋ฅธ ๊ธ
[๋ฐฑ์ค] 1074๋ฒ Z ์๋ฐ (๋ถํ ์ ๋ณต) (0) | 2022.02.24 |
---|---|
[๋ฐฑ์ค] 2630๋ฒ ์์ข ์ด ๋ง๋ค๊ธฐ ์๋ฐ (๋ถํ ์ ๋ณต) (0) | 2022.02.22 |
[๋ฐฑ์ค] 1697 ์จ๋ฐ๊ผญ์ง 1์ฐจ์ BFS (0) | 2022.02.12 |
[๋ฐฑ์ค] 1966 ํ๋ฆฐํฐ ํ + ํ ์คํธ์ผ์ด์ค (0) | 2022.02.11 |
[๋ฐฑ์ค] 9012 ๊ดํธ (0) | 2022.02.11 |