https://school.programmers.co.kr/learn/courses/30/lessons/159993
๋ฌธ์
- ๋ฒฝ์ผ๋ก ๋ ์นธ์ ์ง๋๊ฐ ์ ์๊ณ ํต๋ก๋ก ๋ ์นธ์ผ๋ก๋ง ์ด๋ํ ์ ์๋ค.
- ๋ฏธ๋ก๋ฅผ ๋น ์ ธ๋๊ฐ๋ ๋ฌธ์ด ์๋๋ฐ, ์ด ๋ฌธ์ ๋ ๋ฒ๋ฅผ ๋น๊ฒจ์๋ง ์ด ์ ์๋ค.
- ์ถ๋ฐ ์ง์ ์์ ๋จผ์ ๋ ๋ฒ๊ฐ ์๋ ์นธ์ผ๋ก ์ด๋ํ์ฌ ๋ ๋ฒ๋ฅผ ๋น๊ธด ํ ๋ฏธ๋ก๋ฅผ ๋น ์ ธ๋๊ฐ๋ ๋ฌธ์ด ์๋ ์นธ์ผ๋ก ์ด๋ํ๋ฉด ๋๋ค.
- ์์ง ๋ ๋ฒ๋ฅผ ๋น๊ธฐ์ง ์์๋๋ผ๋ ์ถ๊ตฌ๊ฐ ์๋ ์นธ์ ์ง๋๊ฐ ์ ์๋ค.
- ํ ์นธ์ ์ด๋ํ๋๋ฐ 1์ด, ์ต๋ํ ๋น ๋ฅด๊ฒ ๋ฏธ๋ก๋ฅผ ๋น ์ ธ๋๊ฐ๋๋ฐ ๊ฑธ๋ฆฌ๋ ์๊ฐ ๊ตฌํ๊ธฐ
- ํ์ถํ ์ ์๋ค๋ฉด -1์ return
- S : ์์ ์ง์ , E : ์ถ๊ตฌ, L : ๋ ๋ฒ, O : ํต๋ก, X : ๋ฒฝ
- ์์ ์ง์ ๊ณผ ์ถ๊ตฌ, ๋ ๋ฒ๋ ํญ์ ๋ค๋ฅธ ๊ณณ์ ์กด์ฌํ๋ฉฐ ํ ๊ฐ์ฉ๋ง ์กด์ฌ
์ ์ถ๋ ฅ ์
- ์ ๋ ฅ : maps ["SOOOL","XXXXO","OOOOO","OXXXX","OOOOE"]
- ์ถ๋ ฅ : 16
ํ์ด
- ๊ทธ๋ํ ํ์ ์ค BFS ์ฌ์ฉ
- BFS 1 : S → L๋ก ๊ฐ๋ ๊ธธ. -1์ด ๋ฆฌํด๋์์ผ๋ฉด ๋ค์ ๋๋ฆด ํ์๋ ์์ด ์ข ๋ฃ
- BFS 2 : L → E ๋ก ๊ฐ๋ ๊ธธ์ ๋ํด BFS๋ฅผ ๋๋ฆฐ๋ค. -1์ด ๋ฆฌํด๋์์ผ๋ฉด ์ข ๋ฃ, ์๋๋ฉด BFS 1 + BFS 2๊ฐ ์ ๋ต
- ์ฌํ์ฉ์ฑ์ ์ํด BFS์ ์์ ์์ ๊ณผ ๋ชฉํ ์ง์ ์ ๋งค๊ฐ๋ณ์๋ก ์ค๋ค
- ํ์ ์ง์ ์ ์ขํ์ ๊ฑธ๋ฆฐ ์๊ฐ์ ์ ๋ณด๋ฅผ ๋ด์ ๊ฐ์ฒด๋ฅผ ๋ฃ๋๋ค
- Point(x, y, dist)
์ฝ๋
import java.util.*;
class Solution {
static int N, M; //ํ, ์ด ํฌ๊ธฐ
static char[][] graph; //๊ทธ๋ํ
static boolean[][] visited; //๋ฐฉ๋ฌธ ์ฌ๋ถ ๋ฐฐ์ด
static int[] dx = {-1, 1, 0, 0}; //์ํ์ข์ฐ
static int[] dy = {0, 0, -1, 1};
static class Point {
int x, y, dist; //ํ, ์ด, ๊ฑธ๋ฆฐ ์๊ฐ
Point(int x, int y, int dist) {
this.x = x;
this.y = y;
this.dist = dist;
}
}
public int solution(String[] maps) {
N = maps.length;
M = maps[0].length();
graph = new char[N][M];
int SX = 0, SY = 0; //์์ ์ขํ
int LX = 0, LY = 0; //๋ ๋ฒ ์ขํ
for(int i = 0; i < N; i++) {
graph[i] = maps[i].toCharArray();
for(int j = 0; j < M; j++) {
if(graph[i][j] == 'S') {
SX = i;
SY = j;
} else if(graph[i][j] == 'L') {
LX = i;
LY = j;
}
}
}
int answer = 0;
visited = new boolean[N][M];
int result1 = bfs(SX, SY, 'L'); //์์~๋ ๋ฒ๊น์ง ์๊ฐ
if(result1 == -1) {
return -1;
} else {
answer += result1;
}
visited = new boolean[N][M];
int result2 = bfs(LX, LY, 'E'); //๋ ๋ฒ~์ถ๊ตฌ๊น์ง ์๊ฐ
if(result2 == -1) {
return -1;
} else {
answer += result2;
}
return answer;
}
public int bfs(int i, int j, char goal) {
Queue<Point> queue = new LinkedList<>();
queue.add(new Point(i, j, 0));
visited[i][j] = true;
while(!queue.isEmpty()) {
Point point = queue.poll();
int x = point.x;
int y = point.y;
int dist = point.dist;
if(graph[x][y] == goal) {
return dist;
}
for(int d = 0; d < 4; d++) {
int nx = x + dx[d];
int ny = y + dy[d];
if(0 <= nx && nx < N && 0 <= ny && ny < M) { //๋ฒ์ ์ฒดํฌ
if(!visited[nx][ny] && graph[nx][ny] != 'X') { //๋ฐฉ๋ฌธx, ๋ฒฝ์ด ์๋
queue.add(new Point(nx, ny, dist + 1));
visited[nx][ny] = true;
}
}
}
}
return -1;
}
}
๊ฒฐ๊ณผ
๋ฐฐ์ด์
'Algorithm > ํ๋ก๊ทธ๋๋จธ์ค' ์นดํ ๊ณ ๋ฆฌ์ ๋ค๋ฅธ ๊ธ
ํ๋ก๊ทธ๋๋จธ์ค - ํธํ ๋์ค (0) | 2023.08.04 |
---|---|
ํ๋ก๊ทธ๋๋จธ์ค - ์ฃผ์ ๊ฐ๊ฒฉ (0) | 2023.08.03 |
ํ๋ก๊ทธ๋๋จธ์ค - ๋ํ์ค ๊ฒ์ (0) | 2023.07.27 |
ํ๋ก๊ทธ๋๋จธ์ค - ๋ฆฌ์ฝ์ณ ๋ก๋ด (0) | 2023.07.26 |
ํ๋ก๊ทธ๋๋จธ์ค - ๊ณผ์ ์งํํ๊ธฐ (0) | 2023.07.26 |