[백준] 2178번: 미로 탐색

2024. 10. 1. 02:04·PS

 

 


 

문제

https://www.acmicpc.net/problem/2178

 

 

개념

그래프, BFS

 

 

실행 결과

 

 

 

 

 

구현 코드(c++)

#include <iostream>
#include <queue>
using namespace std;

int n, m;
int arr[100][100];   // 미로 배열
int dist[100][100];  // 최단 거리 배열

int main() {
  ios_base::sync_with_stdio(false);
  cin.tie(nullptr);

  // 미로의 크기 입력
  cin >> n >> m;

  // dx,dy: 상, 우, 하, 좌 방향 벡터
  int dx[4] = {1, 0, -1, 0};
  int dy[4] = {0, 1, 0, -1};

  // 미로 입력 받기 (행->렬)
  for (int i = 0; i < n; i++) {
    for (int j = 0; j < m; j++) {
      // 먼저 문자로 처리하고 0을 빼서 숫자로 변환
      char c;
      cin >> c;
      arr[i][j] = c - '0';
    }
  }

  // BFS에 사용할 큐
  queue<pair<int, int>> q;
  // 시작점 (0, 0) 큐에 넣고, 거리 초기화
  q.push({0, 0});
  dist[0][0] = 1;  // 시작점의 거리를 1로 설정 (첫 칸 포함)

  // BFS 탐색 시작
  while (!q.empty()) {
    auto cur = q.front();
    q.pop();

    // 현재 위치에서 4방향으로 이동
    for (int dir = 0; dir < 4; dir++) {
      int nx = cur.first + dx[dir];
      int ny = cur.second + dy[dir];

      // 범위 체크
      if (nx < 0 || nx >= n || ny < 0 || ny >= m)
        continue;

      // 벽이거나 이미 방문한 곳이면 건너뛰기
      if (arr[nx][ny] == 0 || dist[nx][ny] != 0)
        continue;

      // 새로운 곳이면 거리 갱신하고 큐에 넣기
      dist[nx][ny] = dist[cur.first][cur.second] + 1;
      q.push({nx, ny});
    }
  }

  // 도착 지점에서 거리 출력
  cout << dist[n - 1][m - 1];

  return 0;
}

 

 

 

 

코드 설명

최단 경로 -> bfs + 상하좌우 이동이므로 dx, dy 테크닉을 이용한다.

 

문제에서 주어진 2차원 배열의 미로를 살펴보자.

1은 갈 수 있는 길이고 0은 갈 수 없는 길이다.

 

2차원 배열 arr은 미로, dist는 이동한 거리를 저장하도록 한다.

dx, dy 테크닉을 활용하여 상, 우, 하, 좌 순서대로 x, y 좌표를 저장하는 배열을 만들어둔다.

 

첫칸 설정

첫번째 좌표인 (0, 0)을 큐에 넣고, dist에 1을 넣는다. 

큐가 비어있을 때까지, 즉 더이상 방문할 곳이 없을 때까지 bfs를 반복한다.

이 반복문 내에서 현재 위치인 cur에서 4방향으로 이동할 수 있는지 확인하고, 이동할 수 있는 경우만 이동한다. 

 

      // 범위 체크
      if (nx < 0 || nx >= n || ny < 0 || ny >= m)
        continue;

      // 벽이거나 이미 방문한 곳이면 건너뛰기
      if (arr[nx][ny] == 0 || dist[nx][ny] != 0)
        continue;

 

다음과 같은 경우 continue를 통해 건너뛴다.

  1. 미로를 벗어나는 범위인 경우 (x, y좌표가 음수이거나 n,m 크기 벗어나는 경우)
  2. arr에서 해당 칸이 막혀있는 경우(0) or 해당 칸을 이미 방문한 경우
      // 새로운 곳이면 거리 갱신하고 큐에 넣기
      dist[nx][ny] = dist[cur.first][cur.second] + 1;
      q.push({nx, ny});

 

위에 해당하지 않으면 아직 방문하지 않은 곳이므로,

dist 배열에 집어넣고 +1을 통해 거리를 갱신하고 방문처리한다.

 


 

 

 

[실전 알고리즘] 0x09강 - BFS

안녕하세요 여러분, 드디어 올 것이 왔습니다. 마음의 준비를 단단히 하셔야 합니다.. 드디어 실전 알고리즘 강의에서 첫 번째 고비에 도달했는데 이 강의와 함께 이번 고비를 잘 헤쳐나가면 좋

blog.encrypted.gg

 

저작자표시 (새창열림)

'PS' 카테고리의 다른 글

[프로그래머스] 주사위 게임 3  (2) 2024.10.09
[백준] 10830번: 행렬 제곱  (0) 2024.10.08
[코드트리] 행복한 수열의 개수  (1) 2024.09.29
[백준] 1260번: DFS와 BFS  (0) 2024.09.29
[백준] 1475번: 방 번호  (0) 2024.09.25
'PS' 카테고리의 다른 글
  • [프로그래머스] 주사위 게임 3
  • [백준] 10830번: 행렬 제곱
  • [코드트리] 행복한 수열의 개수
  • [백준] 1260번: DFS와 BFS
abyss-s
abyss-s
프론트엔드 개발합니다!
  • abyss-s
    abyss-s의 블로그입니다.
    abyss-s
  • 전체
    오늘
    어제
    • 분류 전체보기 (195)
      • Web (17)
        • JavaScript (6)
        • TypeScript (1)
        • React (6)
        • Vue (0)
        • Storybook (1)
        • Next.js (1)
      • Backend & Infra (8)
        • Database (3)
        • Node.js (2)
        • SpringBoot (1)
      • PS (71)
      • CS (30)
        • OS (13)
        • Structure & Algorithm (5)
        • Network (10)
        • 정보처리기사 (2)
      • Language (18)
        • OOP (1)
        • JAVA (13)
        • C++ (4)
      • Activities (18)
        • 멋쟁이 사자처럼 (2)
        • OSSCA (4)
        • LG U+ URECA (5)
        • Project (2)
        • Conference (2)
      • IT (3)
      • AI (0)
      • Git & Github (5)
      • Notion (1)
      • Statistics (11)
      • Book (5)
      • Diary (1)
      • Game (1)
  • 블로그 메뉴

    • 홈
    • 태그
    • 방명록
  • 링크

    • Github
    • Baekjoon
    • X
    • LinkedIn
  • 공지사항

    • abyss-s의 티스토리에 오신 것을 환영합니다.
  • 인기 글

  • 태그

    BAEKJOON
    OS
    Java
    통계학
    Python
    ossca
    코드트리
    React
    운영체제
    DP
    네트워크
    C++
    자바기반응용프로그래밍
    그리디
    JavaScript
    생활코딩
    파이썬
    자바스크립트
    백준
    BFS
  • 최근 댓글

  • 최근 글

  • hELLO· Designed By정상우.v4.10.4
abyss-s
[백준] 2178번: 미로 탐색
상단으로

티스토리툴바