일 | 월 | 화 | 수 | 목 | 금 | 토 |
---|---|---|---|---|---|---|
1 | 2 | 3 | 4 | 5 | ||
6 | 7 | 8 | 9 | 10 | 11 | 12 |
13 | 14 | 15 | 16 | 17 | 18 | 19 |
20 | 21 | 22 | 23 | 24 | 25 | 26 |
27 | 28 | 29 | 30 |
Tags
- 문자열
- 프로그래머스
- SQL
- 구현
- DP
- oracle
- 알고리즘
- Java
- 시뮬레이션
- 아스키코드
- Stack
- 그리디
- BFS
- 다리 만들기
- 새벽코딩
- 백트래킹
- 브루트포스
- 탐색
- BufferedReader
- LIS
- Queue
- 스택
- 다이나믹프로그래밍
- dfs
- 백준
- 빅데이터
- 배열
- HashMap
- 완전탐색
- Python
Archives
- Today
- Total
새벽코딩
[백준] [2178] 미로탐색 (JAVA) 본문
반응형
문제
N×M크기의 배열로 표현되는 미로가 있다.
1 | 0 | 1 | 1 | 1 | 1 |
1 | 0 | 1 | 0 | 1 | 0 |
1 | 0 | 1 | 0 | 1 | 1 |
1 | 1 | 1 | 0 | 1 | 1 |
미로에서 1은 이동할 수 있는 칸을 나타내고, 0은 이동할 수 없는 칸을 나타낸다. 이러한 미로가 주어졌을 때, (1, 1)에서 출발하여 (N, M)의 위치로 이동할 때 지나야 하는 최소의 칸 수를 구하는 프로그램을 작성하시오. 한 칸에서 다른 칸으로 이동할 때, 서로 인접한 칸으로만 이동할 수 있다.
위의 예에서는 15칸을 지나야 (N, M)의 위치로 이동할 수 있다. 칸을 셀 때에는 시작 위치와 도착 위치도 포함한다.
입력
첫째 줄에 두 정수 N, M(2 ≤ N, M ≤ 100)이 주어진다. 다음 N개의 줄에는 M개의 정수로 미로가 주어진다. 각각의 수들은 붙어서 입력으로 주어진다.
출력
첫째 줄에 지나야 하는 최소의 칸 수를 출력한다. 항상 도착위치로 이동할 수 있는 경우만 입력으로 주어진다.
예제 입력 1 복사
4 6
101111
101010
101011
111011
예제 출력 1 복사
15
예제 입력 2 복사
4 6
110110
110110
111111
111101
예제 출력 2 복사
9
예제 입력 3 복사
2 25
1011101110111011101110111
1110111011101110111011101
예제 출력 3 복사
38
예제 입력 4 복사
7 7
1011111
1110001
1000001
1000001
1000001
1000001
1111111
예제 출력 4 복사
13
※ JAVA 코드
import java.io.*;
import java.util.*;
public class Main {
static int N, M;
static int [][] map;
static int [][] dap;
static boolean [][] visited;
static int [] dx = {-1, 1, 0, 0};
static int [] dy = {0, 0, -1, 1};
public static void BFS(int x, int y) {
Queue<int []> q = new LinkedList<>();
q.offer(new int[] {x, y});
while(!q.isEmpty()) {
int [] now = q.poll();
int nowX = now[0];
int nowY = now[1];
for(int i = 0; i < 4; i++) {
int nextX = nowX + dx[i];
int nextY = nowY + dy[i];
// 나아가고자 하는 방향이 맵의 크기를 벗어난 경우,
// 방문했던 좌표인 경우
// 벽(0)인 경우 를 제외한다.
if(nextX <= 0 || nextY <= 0 || nextX > N || nextY > M ||
visited[nextX][nextY] || map[nextX][nextY] == 0) continue;
q.offer(new int[] {nextX, nextY});
visited[nextX][nextY] = true;
dap[nextX][nextY] = dap[nowX][nowY] + 1;
}
}
}
public static void main(String[] args) throws IOException {
BufferedReader br = new BufferedReader(new InputStreamReader(System.in));
StringTokenizer st;
st = new StringTokenizer(br.readLine());
N = Integer.parseInt(st.nextToken());
M = Integer.parseInt(st.nextToken());
map = new int[N+1][M+1];
dap = new int[N+1][M+1];
visited = new boolean[N+1][M+1];
for(int i = 1; i <= N; i++) {
String input = br.readLine();
int idx = 0;
for(int j = 1; j <= M; j++) {
map[i][j] = (int) input.charAt(idx++)-'0';
}
}
BFS(1, 1);
System.out.println(dap[N][M]+1);
}
}
※생각정리
BFS 탐색문제는 거의 동일한 패턴에 응용을 요하는 문제들이 많다. 이번 탐색은 맵의 크기가 주어지고 해당 맵의 크기를 벗어나지 않는 선에서 방문한 좌표를 중복 방문하지 않으면서, 벽이아닌 통로쪽으로만 나아가야한다.
위의 조건들에 만족하는 좌표를 큐에 담아두고 꺼내면서 map과 똑같은 dap배열에 해당좌표까지 걸리는 시간(이동거리)를 담아둔다.
-새벽코딩-
반응형
'알고리즘' 카테고리의 다른 글
[백준] [9461] 파도반 수열 (JAVA) (DP) (2) | 2022.12.14 |
---|---|
[백준] [5567] 결혼식 (JAVA) (0) | 2022.12.14 |
[백준] [16953] A -> B (0) | 2022.12.13 |
[백준] [1743] 음식물 피하기 (0) | 2022.12.11 |
[백준] [2644] 촌수계산 (2) | 2022.12.10 |
Comments