1. 문제
25416번: 빠른 숫자 탐색
5 x 5 크기의 보드가 주어진다. 보드는 1 x 1 크기의 정사각형 격자로 이루어져 있다. 보드의 격자에는 -1, 0, 1중 하나의 숫자가 적혀 있다. 격자의 위치는 (r, c)로 표시한다. r은 행 번호, c는 열 번호
www.acmicpc.net
2. 풀이
전형적인 미로 탐색 문제이다. BFS의 개념을 이해하고 있다면 Standard와 같은 문제이므로 큰 어려움 없이 풀이가 가능하다.
네 방위(동, 서, 남, 북)로 움직일 수 있는 학생이 움직일 수 없는 조건에 대해서만 적절하게 체크해주면 풀이가 가능하다. 까다로운 조건 없이 좌표계에서 이동만 하는 것이며, `1`이 적힌 어딘가에 있는 지점으로 도달해야하므로 BFS가 가장 적합한 수단이라고 볼 수 있다.
학생이 움직일 수 없는 조건
- 이동하고자 하는 지점에 -1이 적혀 있는 경우
- 이미 방문한 곳을 다시 방문하고자 하는 경우
두 번째 조건의 경우 BFS로 풀이하기 위한 추가 조건이며, 이차원 정수 배열을 사용하여 각 지점에 도달할 시에 거리를 업데이트 해준다. 이 때, 업데이트된 지점으로 방문하고자 할 경우 이는 이미 최소 경로로 탐색이 된 지점이므로 탐색에서 배제하기 위함이다.
그 외의 특이점이라면 1이 적힌 지점에 도달할 수 없는 경우 -1을 반환해야 하므로 이것에 대한 처리만 적절히 잘 해주면 된다.
3. 소스코드
public class Main {
static final int[] dy = {-1, 0, 1, 0};
static final int[] dx = {0 ,1, 0, -1};
static int[][] map = new int[5][5];
static int[][] visit = new int[5][5];
static int bfs(int r, int c) {
Queue<Point> q = new LinkedList<>();
q.add(new Point(r, c));
visit[r][c] = 0;
while (!q.isEmpty()) {
Point now = q.poll();
for (int dir = 0; dir < 4; dir++) {
int ny = now.y + dy[dir];
int nx = now.x + dx[dir];
if (!canVisit(ny, nx)) continue;
if (map[ny][nx] == 1) return visit[now.y][now.x] + 1;
q.add(new Point(ny, nx));
visit[ny][nx] = visit[now.y][now.x] + 1;
}
}
return -1;
}
static boolean canVisit(int y, int x) {
return 0 <= y && 0 <= x && y < 5 && x < 5 && visit[y][x] == -1 && map[y][x] != -1;
}
public static void main(String[] args) throws IOException {
BufferedReader br = new BufferedReader(new InputStreamReader(System.in));
BufferedWriter bw = new BufferedWriter(new OutputStreamWriter(System.out));
StringTokenizer st;
for (int i = 0; i < 5; i++) {
st = new StringTokenizer(br.readLine());
for (int j = 0; j < 5; j++) {
map[i][j] = Integer.parseInt(st.nextToken());
visit[i][j] = -1;
}
}
st = new StringTokenizer(br.readLine());
bw.write(bfs(Integer.parseInt(st.nextToken()), Integer.parseInt(st.nextToken())) + "");
bw.flush();
bw.close();
br.close();
}
static class Point {
int y, x;
public Point(int y, int x) {
this.y = y;
this.x = x;
}
}
}
Problem Solved: 25416번 빠른 숫자 탐색 · kwanik-kor/BOJ@6f85432
Showing 1 changed file with 79 additions and 0 deletions.
github.com
BFS 개념은 아래 게시글을 참고♥️
그래프와 BFS(Graph & Breadth First Search)
BFS(너비 우선 탐색) 알고리즘에 대해 알아보기 전에 필수적으로 알아봐야 할 자료구조는 바로 그래프(Graph)다. 그래프는 실질적으로 프로그래밍 언어 라이브러리 상에서 제공하기 보다는 추상적
kwanik.tistory.com
'Algorithm > 문제풀이' 카테고리의 다른 글
[ 백준 1981 ] 배열에서 이동 (0) | 2023.02.09 |
---|---|
[ 백준 26999 ] Satellite Photographs (0) | 2023.02.08 |
[ 백준 2842 ] 집배원 한상덕 (0) | 2020.07.27 |
[ 백준 2504 ] 괄호의 값 - Stack (0) | 2020.07.01 |
[ 백준 9328 ] 열쇠 (0) | 2020.07.01 |