๐ BFS / Breadth-First Search / ๋๋น ์ฐ์ ํ์
๋๋น ์ฐ์ ํ์ :
ํ๋์ ์ ์ ์์ ์์ํด์ ์ฐจ๋ก๋ก ๋ชจ๋ ์ ์ ์ ๋ฐฉ๋ฌธํ๊ฒ ๋๋ค.
๋ฐ๋ผ์ ํน์ ๋์์์ ๋ค๋ฅธ ๋์๋ก ๊ฐ๊ฑฐ๋, ๋ฏธ๋ก์ ์ต๋จ ๊ฑฐ๋ฆฌ๋ฅผ ์ฐพ๊ฑฐ๋,
๋ณดํต์ ๋ ์ขํ ์ฌ์ด์ ( ๋ ธ๋ ์ฌ์ด์ ) ์ต๋จ ๊ฒฝ๋ก ํน์ ์์ ๊ฒฝ๋ก๋ฅผ ์ฐพ๊ธฐ ์ํด ์ด๋ค.
๐ฅ ๊ตฌํ ์, ํน์ ์ขํ ( ๋ ธ๋ ) ๋ฅผ ๋ฐฉ๋ฌธํ๊ฒ์ ๋ํ ์ฌ๋ถ๋ฅผ ๋ฐ๋์ ๊ฒ์ฌํด์ผ ํ๋ค.
๊ฒ์ฌํ์ง ์๋๋ค๋ฉด ๋ฌดํ ๋ฃจํ์ ๋น ์ง ์ํ์ด ์กด์ฌํ๋ค.
๋ฐฉ๋ฌธํ ๋ ธ๋๋ฅผ ์ฐจ๋ก๋ก ๊บผ๋ผ ์ ์๋ ์๋ฃ ๊ตฌ์กฐ์ธ Queue ๋ฅผ ์ฌ์ฉ. ์ฆ ์ ์ ์ ์ถ์ด ์์น์ด๋ค.
๐ฅ ์ ์ต๋จ ๊ฑฐ๋ฆฌ๊ฐ ๋๋๊ฐ ?
https://wikidocs.net/125662 ์ฐธ์กฐ :
๋ฏธ๋กํ์๊ณผ ๊ฐ์ ๋ฌธ์ ๋ฅผ BFS๋ฅผ ๊ตฌํํ๋ค๋ณด๋ฉด, ๋๊ตฌ๋ ํ ๋ฒ์ฉ์ ์๊ตฌ์ฌ์ ๊ฐ๊ฒ ๋ฉ๋๋ค. ๊ณ์ํด์ visited๋ฅผ ํตํด ๊ฒฝ๋ก๋ฅผ ์ฐ์ด ๋ณด๋ฉด์๋, "์ด ๊ฒฝ๋ก๊ฐ ์ ๋ง ์ต์ ๊ฒฝ๋ก๊ฐ ๋ง์๊น?" ๋๋ "ํน์ ๋ค๋ฅธ ๊ฒฝ๋ก๋ฅผ ํตํด์ ๊ฐ๋ฉด ์ต์๊ฐ์ ๊ฐ๊ฒ ๋๋ ๊ฒฝ์ฐ์ ์๊ฐ ์๊ธธ ์ ๋ ์์ง ์์๊น?" ๊ฐ์ ์๋ฌธ์ด ๋ค๊ฒ ๋ฉ๋๋ค. ์ฒ์ฒํ ์๊ฐํด ๋ณด๊ฒ ์ต๋๋ค. ๊ฐ์ฅ ๋จผ์ ์์์ ์ ์คํ๋ ์ขํ์ visited ๋ฐฐ์ด์๋ ์ถ๋ฐ์ง๋ฅผ ๋ปํ๋ 1์ ํ๊ธฐํ๊ฒ ๋ฉ๋๋ค. ๊ทธ๋ฆฌ๊ณ ๋ ๋ฒ ์งธ๋ก ๊ฐ ์ ์๋ ๋ชจ๋ ๊ฒฝ๋ก์๋ 2๊ฐ, ์ธ ๋ฒ๋ง์ ๋๋ฌ์ด ๊ฐ๋ฅํ ๊ณณ์๋ ๋ชจ๋ 3์ด ํ๊ธฐ๋ฉ๋๋ค. ์ด๋ ๊ฒ vistied๋ฐฐ์ด์๋ ๋ชจ๋ ์๊ฐ ๊ฐ ์ ์๋ ์ต์ ์ ๊ฒฝ์ฐ์ ์๊ฐ ๊ธฐ์ ๋๋ ๊ฒ์ด์ง์. ๋ค๋ฅธ ๋ง๋ก ํํํด๋ณด๋ฉด, ๋ด๊ฐ ์ด๋ฒ์ ํ์ํด์ ๋ฐ๊ฒฌํ ๋ ธ๋๊ฐ ์ด๋ฏธ ์ด์ ์ ๋ฐฉ๋ฌธํ ๋ ธ๋๋ผ๋ฉด, ๊ธฐ์กด์ ์ฑ์์ง ๊ฐ์ ์๋ก ์ฑ์ฐ๋ ค๋ ๊ฐ๋ณด๋ค ํญ์ ์๊ฑฐ๋ ๊ฐ์ ์ ๋ฐ์ ์๋ค๋ ๋ป ์ ๋๋ค. ๋ฐ๋ผ์ ์ฐ๋ฆฌ๋ ํด๋น ๋ ธ๋์ ๋ฐฉ๋ฌธ ์ฌ๋ถ(if(visited[i][j]==0)) ๋ง ํ์ธํ๊ฒ ๋๋ ๊ฒ์ด์ง์. |
๋ฌผ๊ฒฐ์ ํ๋์ ๋น์ ํ ์ค๋ช ๋ ์๋ค.
๋์์ ๋ค๋ฅธ ๋ ธ๋๋ฅผ ๊ณ์ํด์ ์ฑ์๊ฐ๊ณ , ์ฑ์ ๊ฐ ๊ณณ์ ๋ฐฉ๋ฌธํ๋ค๋ ๊ธฐ๋ก์ ๋จ๊ธฐ๊ธฐ ๋๋ฌธ์.
๊ตฌํ :
// ํด๋์ค๋ก ๋ด์์ ์ด๋ค.
class Location {
int row;
int col;
int dist;
public Location(int row, int col, int dist) {
this.row = row;
this.col = col;
this.dist = dist;
}
}
//// ์ข์ฐ ์ํ ๊ฐ๊ฒฉ๊ณผ ๋ฏธ๋ก๋ฅผ ๋ด์ ๋ฐฐ์ด ๊ทธ๋ฆฌ๊ณ ๋ฐฉ๋ฌธ ์ฌ๋ถ ์ฒดํฌ ๋ฐฐ์ด
static int charNums;
static int linkNums;
static String arr[][];
static boolean[][] visited;
////
public static void main(String[] args) {
maze();
chk = new int[lineNums][charNums];
visited = new boolean[lineNums][charNums];
// ์์์ ์ ๋ฐฉ๋ฌธํ๊ณ ,
visited[1][0] = true;
// A ์ขํ๋ถํฐ ์ถ๋ฐํ๋ค.
int answer = findPath(1,0);
System.out.println(" ์ ๋ต : " + answer);
}
public static int findPath(int x, int y) {
Queue<Location> queue = new LinkedList<>();
int[] xArr = {0,0,-1,1,};
int[] yArr = {-1,1,0,0,};
queue.add(new Location(x,y,1));
visited[x][y] = true;
while(!queue.isEmpty()) {
Location location = queue.poll();
int row = location.row;
int col = location.col;
int dist = location.dist;
// ๋ชฉ์ ์ง๋ 'B' ์ด๋ค
if (arr[row][col].equals("B")) {
System.out.println(" ๋์ฐฉ : " + arr[row][col]);
return dist;
}
for (int i = 0; i < 4; i ++ ) {
// ์ํ์ข์ฐ ๋ฐฐ์ด์ ํตํด ์ํ์ข์ฐ ์์น๋ฅผ ๋ชจ๋ ์ฐพ๋๋ค.
int nextX = row + xArr[i];
int nextY = col + yArr[i];
//๋ฐฉ๋ฌธํ๋๊ฐ? ๋ฐฉ๋ฌธํ ์์๋๊ฐ?
if (checkLocation(nextX,nextY) && !visited[nextX][nextY]) {
// ํ, ์ฐ ๋ชจ๋ ๋ฐฉ๋ฌธ ๊ฐ๋ฅํ๋ค๋ฉด,
// ํ์๋ 2๊ฐ์ ๋ฐฉํฅ์ด ๋์์ ๋ค์ด๊ฐ๋ค.
queue.add(new Location(nextX, nextY, dist+1));
// ๋ฐฉ๋ฌธ ๊ธฐ๋ก.
visited[nextX][nextY] = true;
}
}
}
return 0;
}
๋ฐฉ๋ฌธ ์ฒดํฌ.
// ๋ฐฉ๋ฌธ ์ฌ๋ถ ์ฒดํฌ
public static boolean checkLocation (int nextX, int nextY) {
if (nextX < 0 || nextX >= charNums || nextY < 0 || nextY >= lineNums || arr[nextX][nextY].equals("0")) {
return false;
}
return true;
}
๋ฏธ๋ก :
0์ ๋ชป์ง๋๊ฐ๋ค.
๋ฏธ๋ก ๋ฐฐ์ด :
String mazes =
"0000000000000000000000000000000000000000000000000000000000000000\n" +
"A 000 000\n" +
"0000000000000 000 000000000000000000 00 0000000000000000000 00 0\n" +
"0 0 00 0 00 00 0 00 0 0 0 0\n" +
"0000 000 0 00 0 00000000000000000 00 00 000 00 00 0 0000 00 0 0\n" +
"0 0 0 0 00 0 0000 0 00 00 0000000000 0 0000000 0 0\n" +
"0 00 0 0 0 00 0 000000000 0 00 00 0 0 0 0\n" +
"0 0 0000 0 0 0 000000000000 0 000000 00000000000\n" +
"0 00000000000 0 0 0 0000000 0 0 0\n" +
"0 0000 0 0 00 000000 0000000000000000 000000 000000000 0\n" +
"0 0000 00 0 B\n" +
"0000000000000000000000000000000000000000000000000000000000000000";
'ALGORITHM' ์นดํ ๊ณ ๋ฆฌ์ ๋ค๋ฅธ ๊ธ
[LIS] ๋ฐฑ์ค 11053 ๊ฐ์ฅ ๊ธด ์ฆ๊ฐํ๋ ๋ถ๋ถ ์์ด (0) | 2022.08.28 |
---|---|
DFS java (0) | 2022.06.17 |
๋ฐฑ์ค 2837 / java (0) | 2022.04.05 |
SHA-256 (Secure Hash Algorithm) (0) | 2022.04.04 |
์์ ํ์ / ๋ชจ์๊ณ ์ฌ (0) | 2022.03.23 |