๊ทธ๋ํ, DFS, BFS ๋ณต์ตํ๊ธฐ
์ผ์๊ณผ ๋ฏธ๋ก ๊ทธ ์ฌ์ด ์ด๋๊ฐ
์ฒ์ ๋ฌธ์ ๋ฅผ ์ ํ์ ๋, ์ธ์ ํ๋ ฌ
๋ก ๋ง๋ค์ด์ง ํ
์ด๋ธ์ ๋ณด๊ณ
"BFS๋ก ํ์ด์ผ ํ๋?"
๋ผ๊ณ ์๊ฐํ๋ค. ๊ทธ๋์ ๊ตฌ์กฐ๋ ๊ธฐ์ต์ด ๋์ง ์์ง๋ง BFS(๋๋น ์ฐ์ ํ์)์ด ์ฌ๊ท๋ Stack ์๋ฃ ๊ตฌ์กฐ๋ฅผ ์ฌ์ฉํ์ง ์๊ณ , Queue ์๋ฃ ๊ตฌ์กฐ๋ฅผ ์ด์ฉํ๋ ๊ฒ์ ๋ฐํ์ผ๋ก ๊ณต๋ถ ํ๋ ๋ด์ฉ์ ํบ์๋ณด๋ฉฐ ์ฝ๋๋ฅผ ์์ฑํ๋ค.
๋์ ! BFS!
package ์ฌ์ฑํ.์๊ณ ๋ฆฌ์ฆ_5์ฃผ์ฐจ;
import java.io.*;
import java.util.*;
public class ๋จ์ง๋ฒํธ๋ถ์ด๊ธฐ_BFS {
static BufferedReader br = new BufferedReader(new InputStreamReader(System.in));
static int n;
static int length = 0;
static int cnt = 0;
static int[][] arr;
public static void main(String[] args) throws Exception {
n = Integer.parseInt(br.readLine());
arr = new int[n][n];
StringTokenizer[] st = new StringTokenizer[n];
for (int i = 0; i < n; i++) {
st[i] = new StringTokenizer(br.readLine());
char[] tmp = st[i].nextToken().toCharArray();
for (int k = 0; k < tmp.length; k++) {
arr[i][k] = tmp[k] - '0';
}
}
int[] xy = { 0, 0 };
bfs(xy);
for (int i = 0; i < arr.length; i++) {
System.out.print("arr[" + i + "] = ");
for (int k = 0; k < arr[i].length; k++) {
System.out.print(arr[i][k]);
}
System.out.println();
}
}
public static void bfs(int[] xy) {
Queue<int[]> queue = new LinkedList<int[]>();
queue.offer(xy);
while (!queue.isEmpty()) {
xy = queue.poll();
int[][] nxy = { { -1, 1, 0, 0 }, { 0, 0, -1, 1 } };
for (int i = 0; i < 4; i++) {
nxy[0][i] = xy[0] + nxy[0][i];
nxy[1][i] = xy[1] + nxy[1][i];
int[] tmp = { nxy[0][i], nxy[1][i] };
if (nxy[0][i] < 0 || nxy[1][i] < 0 || nxy[0][i] >= n || nxy[1][i] >= n)
continue;
System.out.println("arr[" + nxy[0][i] + "][" + nxy[1][i] + "] = " + arr[nxy[0][i]][nxy[1][i]]);
if (arr[nxy[0][i]][nxy[1][i]] == 1) {
arr[nxy[0][i]][nxy[1][i]] = 5;
queue.offer(tmp);
cnt++;
}
}
}
}
}
๊ฒฐ๊ณผ๋ฅผ ๋งํ์๋ฉด ์คํจ๋ค. ๋จผ์ ๊ฒฐ๊ณผ ์ถ๋ ฅ์ ํ์ธ ํด๋ณด์.
์คํจํ ์ด์ ๋ฅผ ๋ค์๊ณผ ๊ฐ์ด ํ์ ํ ์ ์๋ค.
- Queue์ ์์ธ ๋ ธ๋์ ์ขํ ์ค ํ์ฌ ์ขํ๋ฅผ ๊ธฐ์ค์ผ๋ก ๊ธฐ์ค์ ์ํ์ข์ฐ ๋ ธ๋๋ฅผ ํ์ํ๊ณ , ํ์ํ ์ขํ์ ๋ ธ๋๊ฐ ์กฐ๊ฑด์ ๋ถํฉํ์ง ์๋๋ค๋ฉด Queue์ ์์ด์ง ์๋๋ค.
- ์ฆ, Queue์ ๋ง์ง๋ง ์ขํ์ ์ํ์ข์ฐ๋ฅผ ํ์ ํ์ ๋ ์กฐ๊ฑด์ ๋ถํฉํ์ง ์๋๋ค๋ฉด Queue์๋ ์๋ฌด ๊ฒ๋ ์์ด์ง ์๊ธฐ ๋๋ฌธ์ ๋ฐ๋ณต๋ฌธ์ ์ข ๋ฃ๋๋ค.
์ด๋ฌํ ์ด์ ๋ก ์์ ์ฝ์์ ์ถ๋ ฅ๋ ์ธ์ ํ๋ ฌ ํ
์ด๋ธ์ ํ์ธํด๋ณด๋ฉด ์ฒซ ๋ฒ์งธ ๋จ์ง๋ง ํ์ํ๊ณ ๋๋จธ์ง๋ ํ์ํ์ง ๋ชปํ ๊ฒ์ ํ์ธํ ์ ์๋ค.
์ฒซ ๋ฒ์งธ ๋จ์ง์ ๋ง์ง๋ง ๋
ธ๋ ์์น๋ฅผ ๊ธฐ์ค(arr[2][2], x = 2, y = 2
)์ผ๋ก ์ํ์ข์ฐ๋ฅผ ํ์ ํ์ ๋ ์กฐ๊ฑด์ ๋ถํฉํ๋ ๋
ธ๋๊ฐ ์์ผ๋ฏ๋ก Queue์ ์์ด์ง ์๊ณ ๋ฐ๋ณต๋ฌธ์ด ๋๋๋ฉด์ ํด๋น ํ๋ก๊ทธ๋จ์ ์ข
๋ฃ๋๋ค.
๊ทธ๋ ๋ค๋ฉด ํด๋น ๋ฌธ์ ๋ ๋๋น๋ฅผ ํ์ํ๋ ๊ฒ์ด ์๋๋ผ ๊น์ด๋ฅผ ์ฐ์ ์ ์ผ๋ก ํ์ํด์ผ ์ํ๋ ๊ฒฐ๊ณผ๋ฅผ ์ถ๋ ฅํ ์ ์๋ค.
์ฆ, ๋ชจ๋ ๋
ธ๋๋ฅผ ํ์ํ์ง๋ง ์กฐ๊ฑด์ ๋ถํฉํ๋ ๋
ธ๋๋ฅผ ๋ฐ๊ฒฌํ๋ฉด ํด๋น ๋
ธ๋์ ์ธ์ ํ ๋
ธ๋๋ฅผ ๋จผ์ ํ์ํด์ผ ๋ฌธ์ ๋ฅผ ํด๊ฒฐํ ์ ์๋ค.
๊ทธ๋ฆฌ๊ณ ํ์์ ์งํํ๋ฉด์ ์ฒ์ ์กฐ๊ฑด์ ๋ถํฉํ ์ขํ์ ๋
ผ๋ฆฌ๊ฐ true
์ธ ๊ฒฝ์ฐ์ ํด๋น ๋
ธ๋์ ์ฐ๊ฒฐ๋ ๊ฐ์ ์ ๊ฐ์๋ฅผ List ์๋ฃํ์ ๋ด๋๋ค.
๊ทธ๋ฌ๋ฉด ๋ฌธ์ ํด๊ฒฐ!
์ด์ DFS ์๊ณ ๋ฆฌ์ฆ์ผ๋ก ํด๊ฒฐํ ์ฝ๋๋ฅผ ํ์ธ ํด๋ณด์.
๊ฐ๋ผ! DFS๋ชฌ!
[system]์ฑ๊ณต์ ์ผ๋ก ๋ฌธ์ ๋ฅผ ํด๊ฒฐํ๋ค!
package ์ฌ์ฑํ.์๊ณ ๋ฆฌ์ฆ_5์ฃผ์ฐจ;
import java.io.*;
import java.util.*;
public class ๋จ์ง๋ฒํธ๋ถ์ด๊ธฐ_2667 {
static BufferedReader br = new BufferedReader(new InputStreamReader(System.in));
static int n, x, y;
static int length = 0;
static int cnt = 0;
static int[][] arr;
public static void main(String[] args) throws Exception {
n = Integer.parseInt(br.readLine());
arr = new int[n][n];
StringTokenizer[] st = new StringTokenizer[n];
ArrayList<Integer> list = new ArrayList<Integer>();
for (int i = 0; i < n; i++) {
st[i] = new StringTokenizer(br.readLine());
char[] tmp = st[i].nextToken().toCharArray();
for (int k = 0; k < tmp.length; k++) {
arr[i][k] = tmp[k] - '0';
}
}
for (int i = 0; i < arr.length; i++) {
boolean check = false;
for (int k = 0; k < arr[i].length; k++) {
check = dfs(i, k);
System.out.println("---------------------------");
if (check) {
list.add(cnt);
length++;
cnt = 0;
}
}
}
System.out.println(length);
Collections.sort(list);
for (int i : list) {
System.out.println(i);
}
}
public static boolean dfs(int x, int y) {
if (x < 0 || y < 0 || x >= n || y >= n)
return false;
System.out.println("arr[" + x + "][" + y + "] = " + arr[x][y]);
if (arr[x][y] == 1) {
arr[x][y] = 5;
dfs(x - 1, y);
dfs(x + 1, y);
dfs(x, y - 1);
dfs(x, y + 1);
cnt++;
return true;
}
return false;
}
}
๋จผ์ ๊ฒฐ๊ณผ ์ถ๋ ฅ์ ํ์ธ ํด๋ณด์.
์ ์คํฌ๋ฆฐ์ท์ ์ ์ ์ ๊ธฐ์ค์ผ๋ก ํ์ฌ์ ๋ ธ๋๊ฐ ์กฐ๊ฑด์ ๋ถํฉํ ๋ ์ฌ๊ท๊ฐ ๋ฐ์ํ๋ ๋ ธ๋๋ฅผ ์ถ๋ ฅํ ๊ฒฐ๊ณผ๋ค. ์ฆ, Stack ์๋ฃ ๊ตฌ์กฐ๋ฅผ ์ฌ๊ท์ ์ผ๋ก ๊ตฌํ ํ๋ค๊ณ ๋ณผ ์ ์๋ค.
(์ฌ์ค DFS๋ฅผ Stack ์๋ฃ ๊ตฌ์กฐ์ ์ฌ๊ท ํจ์๋ฅผ ์ด์ฉํด ๊ตฌํํ ์ ์๋ค๋ ์ด์ผ๊ธฐ๋ฅผ ๋ฃ๊ณ ๋์ ์ฐจ์ด๊ฐ ๋ฌด์์ธ์ง ์ ํ ์ดํดํ์ง ๋ชปํ๋๋ฐ, ์ด๋ฒ์ ๋น๋ก์ ์ดํดํ ์ ์์๋ค.)
main
๋ฉ์๋์์ ์ธ์ ํ๋ ฌ์ ๊ธธ์ด๋งํผ ๋ฐ๋ณต๋ฌธ์ ๊ตฌ์ฑํ๊ณ ๊ทธ ๋งํผ dfs
๋ฉ์๋๋ฅผ ์ขํ์ ๋ง๊ฒ ํธ์ถํ๋ค. ์ฆ, ๋ชจ๋ ๋
ธ๋๋ฅผ ํ์ํ๋ค๋ ์๋ฏธ์ด๋ค.
๊ทธ๋ ๋ค๋ฉด ์์์ Stack ์๋ฃ ๊ตฌ์กฐ๋ฅผ ์ฌ๊ท์ ์ผ๋ก ๊ตฌํ ํ๋ค๊ณ ํ๋๋ฐ ์ด ๋ง์ ์๋ฏธ๋ ๋ญ๊น?
Stack ์๋ฃ ๊ตฌ์กฐ๋ ๊ธฐ๋ณธ์ ์ผ๋ก FILO(First In Last Out, ์ ์
ํ์ถ) ๊ตฌ์กฐ๋ก ๊ตฌ์ฑ๋์ด ์๋ค.
๋ง์ฝ ์์ ๋ฌธ์ ๋ฅผ Stack ์๋ฃ ๊ตฌ์กฐ๋ก ํด๊ฒฐํ์ ๋, ํน์ ์กฐ๊ฑด์ ๋ถํฉํ๋ค๋ฉด Stack ์๋ฃํ์ ๋
ธ๋์ ์ขํ๋ฅผ push ํ์ ๊ฒ์ด๋ค.
๊ทธ ํ, Stack์ ์์ธ ๋งํผ ๋ฐ๋ณตํ์ฌ ํ ๋ฒ ๋ฐ๋ณต์ ์คํํ ๋ pop์ ํตํด ๊บผ๋ธ ๋
ธ๋ ์ขํ์ ์ํ์ข์ฐ๋ฅผ ๋ค์ ํ์ํ๊ณ , ์ด ๋ ์กฐ๊ฑด์ ๋ถํฉํ ๋
ธ๋ ์ขํ๋ฅผ ๋ค์ Stack์ push ํ๋ค.
์ฆ, ํ์ฌ ๋ ธ๋์ ์ํ์ข์ฐ๋ฅผ ํ์ํ๊ธฐ ์ํ ์กฐ๊ฑด์ ๊ทธ ๋ค์ ๋ ธ๋๋ฅผ ๋จผ์ ํ์ํ๋ค๋ ์๋ฏธ์ด๋ค. ํ๋ ธ์ด์ ํ์ ์ฌ๊ท ํจ์๋ก ํ์๋ ๊ธฐ์ต์ ๋์ด๋ ค ๋ณด์.
์ฌ๊ท ํจ์ ๋ณต์ตํ๊ธฐ
๋ถ๋ช Stack ์๋ฃ ๊ตฌ์กฐ๋ฅผ ์ด์ฉํ์ฌ ํด๊ฒฐํ๋ ค๊ณ ํ๋๋ฐ ์ฝ๋ ๊ตฌ์กฐ์ ๋ฐฉํฅ์ฑ์ด ์ฌ๊ท ํจ์๋ฅผ ์ด์ฉํ์ ๋์ ๊ฑฐ์ ๋น์ทํ๋ค๋ ๊ฒ์ ํ์ธํ ์ ์๋ค. ๊ทธ๋ ๋ค๋ฉด JAVA๋ฅผ ์ด์ฉํ์ ๋ ๊ตณ์ด Stack ํด๋์ค๋ฅผ ํธ์ถํ๊ณ , ๋ฐ๋ณต๋ฌธ ์ฝ๋๋ฅผ ๋ฃ์ด์ ์ฝ๋๋ฅผ ๋๋ฆฌ๋ ๊ฒ๋ณด๋ค ์ฌ๊ท ํจ์๋ฅผ ์ด์ฉํด์ ๋ฌธ์ ๋ฅผ ํ๋ฉด ํจ์ฌ ์ฟจํ ์ฝ๋๊ฐ ๋์ง ์์๊น?
๊ทธ๋์ ์ฌ๊ท์ ์ผ๋ก ๋ฌธ์ ๋ฅผ ํด๊ฒฐํ๋ค.
์ด ๋, ๋จ์ง์ ๊ฐ์๋ฅผ ๋จผ์ ์ถ๋ ฅํ๊ณ , ๊ฐ ๋จ์ง์ ์กด์ฌํ๋ ์ํํธ์ ๊ฐ์๋ฅผ ์ค๋ฆ์ฐจ์์ผ๋ก ์ถ๋ ฅํด์ผ ํ๋๋ฐ ์ฌ๊ท ํจ์๋ก ์ฝ๋๋ฅผ ์ธ๋ ๊ฒ๋ณด๋ค ๊ฐ์ ์ถ๋ ฅํ๊ธฐ ์ํ ๊ท์น์ฑ์ ์ฐพ๋ ๊ฒ์ด ๋ ์ด๋ ค์ ๋ค.
ํด๊ฒฐ ๋ฐฉ๋ฒ์ ์ด๋ ๋ค.
- ๋จ์ง ๋ด ์ํํธ ๊ฐ์ ํ์
ํ๊ธฐ
- ๋จ์ง ๋ด์ ์กด์ฌํ๋ ์ํํธ์ ๊ฐ์๋ ์ฌ๊ท ํจ์ ๋ด์์ ์กฐ๊ฑด์ ๋ถํฉํ ๋๋ง๋ค
cnt++
๋ฅผ ํธ์ถํ๋ค. - ๋จ์ง๊ฐ ๋๋ ํ์
cnt
๋ณ์๋ฅผ ์ด๊ธฐํ ํ์ง ์์ผ๋ฉด ์ ์ฒด ์ํํธ ๊ฐ์๋ฅผ ํ์ ํ๋ ๊ผด์ด ๋๋ค. ๊ทธ๋ ๊ธฐ ๋๋ฌธ์ ์๋ ์กฐ๊ฑด์ ์ฐ์ฅ์ ์ผ๋ก ํ์ฌ ๋ ธ๋๊ฐ ํธ์ถํ ์ฌ๊ท ํจ์์ ๋ ผ๋ฆฌ๊ฐ์ดtrue
์ผ ๊ฒฝ์ฐcnt
๊ฐ์ ์ด๊ธฐํ ํด์ค๋ค.
- ๋จ์ง ๋ด์ ์กด์ฌํ๋ ์ํํธ์ ๊ฐ์๋ ์ฌ๊ท ํจ์ ๋ด์์ ์กฐ๊ฑด์ ๋ถํฉํ ๋๋ง๋ค
- ๋ช ๊ฐ์ ๋จ์ง๊ฐ ์กด์ฌํ๋์ง ํ์
ํ๊ธฐ
- ํ์ฌ ๋
ธ๋๊ฐ ์ํํธ๋ผ๋ฉด ํด๋น ์ํํธ์ ๋จ์ง๋งํผ ์ฌ๊ท ํจ์๋ฅผ ํธ์ถํ ๊ฒ์ด๋ฉฐ, ์ด๋ ํ์ฌ ๋
ธ๋๊ฐ ํธ์ถํ ์ฌ๊ท ํจ์์ ๋
ผ๋ฆฌ๊ฐ์
true
๋ผ๋ ์๋ฏธ์ด๋ค. - ๊ทธ๋ ๋ค๋ฉด
true
๊ฐ ๋์ฌ ๋ ๋จ์ง์ ๊ฐ์๋ฅผ +1 ํ๋ค.
- ํ์ฌ ๋
ธ๋๊ฐ ์ํํธ๋ผ๋ฉด ํด๋น ์ํํธ์ ๋จ์ง๋งํผ ์ฌ๊ท ํจ์๋ฅผ ํธ์ถํ ๊ฒ์ด๋ฉฐ, ์ด๋ ํ์ฌ ๋
ธ๋๊ฐ ํธ์ถํ ์ฌ๊ท ํจ์์ ๋
ผ๋ฆฌ๊ฐ์
์ด๋ ๊ฒ ํ๋ฉด ์์ ์ถ๋ ฅ๋ฌธ์ ํตํด ํ์ ํ ๋จ์ง ๋ด ์ํํธ์ ๊ฐ์, ๋จ์ง์ ๊ฐ์๋ฅผ ํ์ ํ ์ ์๋ค.
๋ฌธ์ ์์๋ ๋จ์ง ๋ด ์ํํธ์ ๊ฐ์๋ฅผ ์ค๋ฆ์ฐจ์์ผ๋ก ์ ๋ ฌํ๋ผ๊ณ ํ๋๋ฐ, ์ด๊ฑธ ๋ ์ต์ํ ๋ฒ๋ธ ์ ๋ ฌ์ด๋ ์ ํ ์ ๋ ฌ๋ก ๊ตฌํํ๊ธฐ ๊ท์ฐฎ์์ Collentions ๊ฐ์ฒด์ sort() ํจ์๋ฅผ ์ด์ฉํด ์ค๋ฆ์ฐจ์์ผ๋ก ์ ๋ ฌํ๊ณ ์ด๋ฅผ ์ถ๋ ฅํ๋ค.
์ด๋ฒ ๋ฌธ์ ๋ฅผ ํ๋ฉด์ ์กฐ๊ธ ์ดํด๋๋ ๊ทธ๋ํ์ ๋ํ ๊ฐ๋
์ ์กฐ๊ธ ๋ ์ดํดํ ์ ์๊ฒ ๋์๋ค.
BFS, DFS ๋ ๊ฒฝ์ฐ ๋ชจ๋ ์ฝ๋๋ก ์์ฑํ๊ณ , ์ด๋ ๊ฒ ๊ธ์ ์ผ๊ธฐ ๋๋ฌธ์ ์์ผ๋ก ๋์๊ฐ ์ ์์๋ ๊ฒ ๊ฐ๋ค!
์์ง ๊ทธ๋ํ๋ฅผ ์์ ํ ์ดํดํ๊ธฐ์๋ ๊น๋ง๋ํ์ง๋ง ๋๋ ค๋ ๋ง๋ ๋ฐฉํฅ์ ํฅํด ๊ฑธ์ด๊ฐ์!
'Algorithm' ์นดํ ๊ณ ๋ฆฌ์ ๋ค๋ฅธ ๊ธ
๋ฐฑ์ค 10816 | ์ซ์ ์นด๋ 2 (0) | 2020.11.07 |
---|---|
ํ์ | ์์ฐจ ํ์, ์ด์ง ํ์, ๋ถํ ์ฐพ๊ธฐ (0) | 2020.11.07 |
๋ฐฑ์ค 2138 | ๊ทธ๋ฆฌ๋ ์๊ณ ๋ฆฌ์ฆ, ์ ๊ตฌ์ ์ค์์น (0) | 2020.11.01 |
Graph | DFS(๊น์ด ์ฐ์ ํ์), BFS(๋๋น ์ฐ์ ํ์) (0) | 2020.10.31 |
๋ฐฑ์ค 11729 | ์ฌ๊ท ํจ์, ํ๋ ธ์ด์ ํ ์ด๋ ์์ (2) | 2020.10.18 |