Notice
Recent Posts
Recent Comments
Link
일 | 월 | 화 | 수 | 목 | 금 | 토 |
---|---|---|---|---|---|---|
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 | 31 |
Tags
- 모두의 네트워크
- React Native
- 자바
- 팀플회고
- 문자열
- 딥러닝
- 백준 4358 자바
- 리액트 네이티브 시작하기
- 데이터베이스
- 스터디
- SQL
- 데베
- 지네릭스
- 깃 연동
- 백준
- 백준 4358번
- 정리
- 깃허브 토큰 인증
- 네트워크
- 리액트 네이티브
- 백준 4949번
- 깃 터미널 연동
- 모두를위한딥러닝
- HTTP
- 백준 5525번
- 머신러닝
- 깃허브 로그인
- 리액트 네이티브 프로젝트 생성
- 모두를 위한 딥러닝
- 모두의네트워크
Archives
- Today
- Total
솜이의 데브로그
백준 2178번 ) 미로 탐색 (java) 본문
https://www.acmicpc.net/problem/2178
문제
풀이
import java.io.*;
import java.util.*;
public class Main {
static int[][] map;
static int N, M;
static boolean[][] visited;
public static void main(String[] args) throws IOException{
BufferedReader br = new BufferedReader(new InputStreamReader(System.in));
StringTokenizer st = new StringTokenizer(br.readLine(), " ");
N = Integer.parseInt(st.nextToken());
M = Integer.parseInt(st.nextToken());
map = new int[N][M];
for(int i=0; i<N; i++){
String line = br.readLine();
for(int j=0; j<M; j++){
map[i][j] = line.charAt(j) - '0';
}
}
visited = new boolean[N][M];
visited[0][0] = true;
bfs(0, 0);
System.out.println(map[N-1][M-1]);
}
public static void bfs(int x, int y){
Queue<int[]> q = new LinkedList<>();
q.add(new int[] {x,y});
int[] dx = {-1, 1, 0, 0};
int[] dy = {0, 0, -1, 1};
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];
if(nextX < 0 || nextY < 0 || nextX >= N || nextY >= M) continue;
if(visited[nextX][nextY] || map[nextX][nextY] == 0) continue;
q.add(new int[] {nextX, nextY});
map[nextX][nextY] = map[nowX][nowY] + 1;
visited[nextX][nextY] = true;
}
}
}
}
dfs로 푸는 문제인줄 알았는데, 시간초과가 나서 BFS로 풀어야하는 문제라고 한다.
현재 좌표의 위아래양옆을 모두 살펴보고, 1인 경우 현재의 위치에서 최단 경로 + 1 해서 저장하고, 큐에 넣으면서 꺼내 비교하는 방식으로 진행한다.
방문한 좌표는 따로 배열에 방문 여부를 저장하여 체크한다.
알아둘 점!
- BFS 는 Queue를 사용하여 구현한다.
- Queue 구현 방법에, 이번에는 좌표 배열을 넣어야 하므로, Queue<int[]> q = new LinkedList<>(); 와 같이 구현하였다.
- 좌표는 배열로 x, y 앞뒤로 지정하여 반복문으로 체크한다.
int[] dx = {-1, 1, 0, 0};
int[] dy = {0, 0, -1, 1};
- BFS를 사용하여 풀이해야하는 경우!!!
- 최소 비용 문제 (또는 최단경로)
- 간선의 가중치가 1인 경우
- 정점과 간선의 개수가 적다. (시간 제약, 메모리 제한 내 만족)
'Algorithm > 백준' 카테고리의 다른 글
백준 2847번 ) 게임을 만든 동준이 (java) (0) | 2022.03.15 |
---|---|
백준 1158번 ) 요세푸스 문제 (java) (0) | 2022.03.15 |
백준 11659번 ) 구간 합 구하기4 (java) (0) | 2022.03.11 |
백준 1991번 ) 트리 순회 (java) (0) | 2022.03.09 |
백준 1260번 ) DFS와 BFS (java) (0) | 2022.03.09 |