KwanIk Devlog

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
profile

KwanIk Devlog

@갈닉

노력하는 개발자가 되고자 합니다. GitHub이나 블로그 모두 따끔한 피드백 부탁드립니다 :)