[ 백준 25416 ] 빠른 숫자 탐색

2023. 2. 7. 10:35·Algorithm/문제풀이

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
'Algorithm/문제풀이' 카테고리의 다른 글
  • [ 백준 1981 ] 배열에서 이동
  • [ 백준 26999 ] Satellite Photographs
  • [ 백준 2842 ] 집배원 한상덕
  • [ 백준 2504 ] 괄호의 값 - Stack
갈닉
갈닉
중요한 건 엔지니어가 되겠다는 마음. 근데 이제 인문학을 곁들인.
    반응형
  • 갈닉
    KwanIk Devlog
    갈닉
  • 전체
    오늘
    어제
    • 분류 전체보기 (53)
      • Algorithm (41)
        • 알고리즘 개요 (8)
        • 문제풀이 (33)
      • Language (2)
        • Java (1)
        • Javascript (0)
        • Go (0)
        • Rust (1)
      • Framework (0)
        • Spring (0)
        • Spring Security (0)
        • Spring JPA (0)
      • Computer Science (1)
        • 프로그래밍 언어 (0)
        • 자료구조 (1)
        • 보안 (0)
      • DevOps (1)
        • MSA (0)
        • TDD (1)
        • DDD (0)
      • 개발서적 (3)
        • 오브젝트 (3)
      • Life (5)
        • 생각생각 (4)
        • 회고록 (1)
  • 블로그 메뉴

    • 홈
    • 태그
  • 링크

    • My Github
  • 공지사항

  • 인기 글

  • 태그

    greedy
    java
    Algorithm
    BruteForce
    구현
    backtracking
    오브젝트
    객체지향
    비트마스크
    깊이우선탐색
    백트래킹
    DP
    백준
    알고리즘
    너비우선탐색
    욕심쟁이알고리즘
    시뮬레이션
    BFS
    bitmask
    boj
  • 최근 댓글

  • 최근 글

  • hELLO· Designed By정상우.v4.10.5
갈닉
[ 백준 25416 ] 빠른 숫자 탐색
상단으로

티스토리툴바