๐๋ฌธ์ ์ค๋ช
๐ฎROR ๊ฒ์์ ๋ ํ์ผ๋ก ๋๋์ด์ ์งํํ๋ฉฐ, ์๋ ํ ์ง์์ ๋จผ์ ํ๊ดดํ๋ฉด ์ด๊ธฐ๋ ๊ฒ์์ ๋๋ค. ๋ฐ๋ผ์, ๊ฐ ํ์ ์๋ ํ ์ง์์ ์ต๋ํ ๋นจ๋ฆฌ ๋์ฐฉํ๋ ๊ฒ์ด ์ ๋ฆฌํฉ๋๋ค.
์ง๊ธ๋ถํฐ ๋น์ ์ ํ ํ์ ํ์์ด ๋์ด ๊ฒ์์ ์งํํ๋ ค๊ณ ํฉ๋๋ค. ๋ค์์ 5 x 5 ํฌ๊ธฐ์ ๋งต์, ๋น์ ์ ์บ๋ฆญํฐ๊ฐ (ํ: 1, ์ด: 1) ์์น์ ์๊ณ , ์๋ ํ ์ง์์ (ํ: 5, ์ด: 5) ์์น์ ์๋ ๊ฒฝ์ฐ์ ์์์ ๋๋ค.
์ ๊ทธ๋ฆผ์์ ๊ฒ์์ ๋ถ๋ถ์ ๋ฒฝ์ผ๋ก ๋งํ์์ด ๊ฐ ์ ์๋ ๊ธธ์ด๋ฉฐ, ํฐ์ ๋ถ๋ถ์ ๊ฐ ์ ์๋ ๊ธธ์
๋๋ค. ์บ๋ฆญํฐ๊ฐ ์์ง์ผ ๋๋ ๋, ์, ๋จ, ๋ถ ๋ฐฉํฅ์ผ๋ก ํ ์นธ์ฉ ์ด๋ํ๋ฉฐ, ๊ฒ์ ๋งต์ ๋ฒ์ด๋ ๊ธธ์ ๊ฐ ์ ์์ต๋๋ค.
์๋ ์์๋ ์บ๋ฆญํฐ๊ฐ ์๋ ํ ์ง์์ผ๋ก ๊ฐ๋ ๋ ๊ฐ์ง ๋ฐฉ๋ฒ์ ๋ํ๋ด๊ณ ์์ต๋๋ค.
์ฒซ ๋ฒ์งธ ๋ฐฉ๋ฒ์ 11๊ฐ์ ์นธ์ ์ง๋์ ์๋ ํ ์ง์์ ๋์ฐฉํ์ต๋๋ค.
๋ ๋ฒ์งธ ๋ฐฉ๋ฒ์ 15๊ฐ์ ์นธ์ ์ง๋์ ์๋ํ ์ง์์ ๋์ฐฉํ์ต๋๋ค.
์ ์์์์๋ ์ฒซ ๋ฒ์งธ ๋ฐฉ๋ฒ๋ณด๋ค ๋ ๋น ๋ฅด๊ฒ ์๋ํ ์ง์์ ๋์ฐฉํ๋ ๋ฐฉ๋ฒ์ ์์ผ๋ฏ๋ก, ์ด ๋ฐฉ๋ฒ์ด ์๋ ํ ์ง์์ผ๋ก ๊ฐ๋ ๊ฐ์ฅ ๋น ๋ฅธ ๋ฐฉ๋ฒ์ ๋๋ค.
๋ง์ฝ, ์๋ ํ์ด ์์ ์ ํ ์ง์ ์ฃผ์์ ๋ฒฝ์ ์ธ์๋์๋ค๋ฉด ์๋ ํ ์ง์์ ๋์ฐฉํ์ง ๋ชปํ ์๋ ์์ต๋๋ค. ์๋ฅผ ๋ค์ด, ๋ค์๊ณผ ๊ฐ์ ๊ฒฝ์ฐ์ ๋น์ ์ ์บ๋ฆญํฐ๋ ์๋ ํ ์ง์์ ๋์ฐฉํ ์ ์์ต๋๋ค.
๊ฒ์ ๋งต์ ์ํ maps๊ฐ ๋งค๊ฐ๋ณ์๋ก ์ฃผ์ด์ง ๋, ์บ๋ฆญํฐ๊ฐ ์๋ ํ ์ง์์ ๋์ฐฉํ๊ธฐ ์ํด์ ์ง๋๊ฐ์ผ ํ๋ ์นธ์ ๊ฐ์์ ์ต์๊ฐ์ return ํ๋๋ก solution ํจ์๋ฅผ ์์ฑํด์ฃผ์ธ์. ๋จ, ์๋ ํ ์ง์์ ๋์ฐฉํ ์ ์์ ๋๋ -1์ return ํด์ฃผ์ธ์.
๐์ ํ์ฌํญ
maps | answer |
---|---|
[[1,0,1,1,1],[1,0,1,0,1],[1,0,1,1,1],[1,1,1,0,1],[0,0,0,0,1]] | 11 |
[[1,0,1,1,1],[1,0,1,0,1],[1,0,1,1,1],[1,1,1,0,0],[0,0,0,0,1]] | -1 |
๐พ์ ์ถ๋ ฅ ์
์
์ถ๋ ฅ ์ #1
์ฃผ์ด์ง ๋ฐ์ดํฐ๋ ๋ค์๊ณผ ๊ฐ์ต๋๋ค.
์บ๋ฆญํฐ๊ฐ ์ ํ์ ์ง์๊น์ง ์ด๋ํ๋ ๊ฐ์ฅ ๋น ๋ฅธ ๊ธธ์ ๋ค์ ๊ทธ๋ฆผ๊ณผ ๊ฐ์ต๋๋ค.
๋ฐ๋ผ์ ์ด 11์นธ์ ์บ๋ฆญํฐ๊ฐ ์ง๋๊ฐ์ผ๋ฏ๋ก 11์ return ํ๋ฉด ๋ฉ๋๋ค.
์
์ถ๋ ฅ ์ #2
๋ฌธ์ ์ ์์์ ๊ฐ์ผ๋ฉฐ, ์๋ ํ ์ง์์ ๋๋ฌํ ๋ฐฉ๋ฒ์ด ์์ต๋๋ค. ๋ฐ๋ผ์ -1์ return ํฉ๋๋ค.
๐๋ฌธ์ ์ดํด ๋ฐ ํ์ด๊ณํ
โ๏ธ์ฒ์์๋ DFS๋ก ๋ฌธ์ ๋ฅผ ํธ๋ ค๊ณ ํ๋๋ฐ ๊ทธ๋ฌ๋ฉด ๋ฐฑํธ๋ํน์ ํด์ ๋ค์ ๋์๊ฐ์ผ ํ๋? ํ๊ณ ์๊ฐ์ด ๋ณต์กํ์๋ค. ์๋๋ ๊ฒ์ ์๋์ง๋ง ์ต๋จ๊ฑฐ๋ฆฌ๋ฅผ ์ต๋ํ ๋นจ๋ฆฌ ๋๋ฌํ๊ธฐ ์ํด์๋ BFS๊ฐ ๋ ์ข์ ๋ฐฉ๋ฒ ์ธ ๊ฒ ๊ฐ๋ค.
โ๏ธํจ์จ์ฑ ๋ฉด์์ ์๊ฐ์ด๊ณผ๊ฐ ๋๊ธธ๋ visited๋ฐฐ์ด์ ๋ฐ๋ก ๋์ง ์์ผ๋ ค๊ณ ์ง๋์จ ๊ธธ์ 0์ผ๋ก ๋ง๋ค์ด ์คฌ๋๋ฐ ์ ์๊ฐ์ด๊ณผ๊ฐ ๋ ๊น ์๊ฐํ๋ค. ๋ฌธ์ ๋ ํ์ ๋ค์ด๊ฐ๋ ๊ธธ์ ์์ง ๋ฐฉ๋ฌธ์ฒ๋ฆฌ๊ฐ ๋์ง ์๊ธฐ ๋๋ฌธ์ ์ค๋ณต์ผ๋ก ๋ค์ด๊ฐ๋ ๊ฒ์ด ๋ฌธ์ ์๋ค.
=> ๊ฒฐ๊ตญ visited๋ฐฐ์ด์ ๋์ด ํ์ ๋ค์ด๊ฐ๋ ๊ธธ์ ๋ฐฉ๋ฌธ์ฒ๋ฆฌ ํ์ฌ ์ค๋ณต์ผ๋ก ํ์ ๋ค์ด๊ฐ์ง ์๋๋ก ์ฒ๋ฆฌํ๋๋ ํจ์จ์ฑ ํ
์คํธ๋ฅผ ํต๊ณผํ๋ค.
import java.util.*;
class Solution {
static boolean[][] visited;
// ๋์ ์์น์ ๋ณด, ํ์ฌ๊น์ง ์ด๋๊ฑฐ๋ฆฌ
public static class Location {
int x, y, move;
public Location(int x, int y, int move) {
this.x = x;
this.y = y;
this.move = move;
}
}
public int solution(int[][] maps) {
int n = maps.length; // ํ์ ๊ธธ์ด
int m = maps[0].length; // ์ด์ ๊ธธ์ด
return bfs(maps, n, m);
}
public static int bfs(int[][] maps, int n, int m) {
Queue<Location> q = new LinkedList<Location>();
visited = new boolean[n][m];
int cur_x = 0;
int cur_y = 0;
int cur_move = 1; // ํ์ฌ๊น์ง ์ด๋ ๊ฑฐ๋ฆฌ
q.add(new Location(cur_x, cur_y, cur_move));
while(!q.isEmpty()) {
Location location = (Location) q.poll();
cur_x = location.x;
cur_y = location.y;
cur_move = location.move;
System.out.println(cur_x + " " + cur_y);
// ๋ฐฉ๋ฌธ ์ฒดํฌ // ์ง๋๊ฐ ๊ธธ์ 0์ผ๋ก ๋ง๋ค์ด ์ค๋ค.
maps[cur_x][cur_y] = 0;
visited[cur_x][cur_y] = true;
for(int i=0; i<4; i++) {
if(cur_x + dx[i] >= 0 && cur_x + dx[i] < n && cur_y + dy[i] >= 0 && cur_y + dy[i] < m && !visited[cur_x + dx[i]][cur_y + dy[i]]) { // ๋งต์ ๋ฒ์ ์์ ์์ ๋
// ๊ฐ ์ ์๋ ๊ธธ์ผ ๋
if(maps[cur_x+dx[i]][cur_y+dy[i]] == 1) {
if(cur_x+dx[i] == n-1 && cur_y+dy[i] == m-1) { // ์๋ํ ์ง์์ ๋์ฐฉ ์
cur_move += 1;
return cur_move;
}
visited[cur_x + dx[i]][cur_y + dy[i]] = true;
q.add(new Location(cur_x+dx[i], cur_y+dy[i], cur_move+1));
}
}
}
}
return -1;
}
}
๐ญ๊ฐ์๋ด์ฉ
โ๏ธ๋๋น์ฐ์ ํ์(BFS)์ ์ ํ์ ์ธ ๋ฌธ์
โ๏ธ์ฌ๋ฐฉ์ผ๋ก ๊ฐ ์ ์๋ ๊ธธ์ ๋ชจ๋ ํ์ํด ๋ณด๋ ๊ฒ. (๋ฒฝ๊ณผ ๋ค๋
์จ ๊ธธ ์ ์ธ)
โ๏ธ๋๋ ๊ท์น์ ๋ง๋ค๊ณ , ์ฐ์ฐ์ ์ปดํจํฐ๊ฐ!
โ๐ป๊ฐ์ ์ฝ๋
import java.util.*;
class Solution {
class Position { // ํ์ฌ ์์น ํด๋์ค
int x, y;
Position(int x, int y) {
this.x = x;
this.y = y;
}
boolean isValid(int width, int height) {
if(x < 0 || x >= width) return false;
if(y < 0 || y >= height) return false;
return true;
}
}
public int solution(int[][] maps) {
int mapHeight = maps.length;
int mapWidth = maps[0].length;
// BFS : Queue // ์ธํฐํ์ด์ค๋ก๋ง ์ ๊ณต. ํ๋ฅผ ๊ตฌํํ๋ ์ฌ๋ฌ ์ค๋ธ์ ํธ ์ค LinkedList๋ฅผ ์ฌ์ฉํ๋ค.
Queue<Position> queue = new LinkedList<>();
int[][] count = new int[mapHeight][mapWidth];
boolean[][] visited = new boolean[mapHeight][mapWidth];
queue.offer(new Position(0, 0));
count[0][0] = 1;
visited[0][0] = true;
while(!queue.isEmpty()) {
Position current = queue.poll();
int currentCount = count[current.y][current.x];
// 4๊ฐ์ง ๊ฒฝ์ฐ
final int[][] moving = {{0, -1}, {0, 1}, {-1, 0}, {1, 0}};
for(int i=0; i<moving.length; i++){
// ์์ฑ์ ํ์!
Position moved = new Position(current.x + moving[i][0], current.y + moving[i][1]);
if(!moved.isValid(mapWidth, mapHeight)) continue;
if(visited[moved.y][moved.x]) continue;
if(maps[moved.y][moved.x] == 0) continue; // 0: ๋ฒฝ, 1: ๊ธธ
count[moved.y][moved.x] = currentCount + 1;
visited[moved.y][moved.x] = true;
queue.offer(moved);
}
}
int answer = count[mapHeight-1][mapWidth-1];
if(answer == 0) return -1;
return answer;
}
}
๐ก๋์ ํ์ด๋ dx
, dy
๋ฅผ ๋ฐ๋ก ๋์ด ๊ฐ๊ฐ ๋ํด์คฌ๋๋ฐ moving๋ฐฐ์ด๋ก ํ๋ฒ์ ์ฒ๋ฆฌํ๋ ๊ฒ๋ ์ข์ ๋ฐฉ๋ฒ์ธ ๊ฒ ๊ฐ๋ค!
๐กx, y์ mapWidth, mapHeight์ ๊ฐ๊ฐ์ ์์น๊ฐ ํท๊น๋ฆฌ๋๋ฐ ์ฝ๋ ์์ฑ ์ ์ ํํ ์ด๋ ์์น์ ๋ค์ด๊ฐ์ผ ํ๋์ง ํ์ธํด์ผ ํ ๊ฒ ๊ฐ๋ค.