[BOJ / C++] 상범 빌딩 (BFS)

2025. 7. 13. 17:08·코딩테스트/BOJ

문제링크: https://www.acmicpc.net/problem/6593

 

1. 코드

#include <bits/stdc++.h>
using namespace std;

int dx[6] = {-1, 1, 0, 0, 0, 0};
int dy[6] = {0, 0, -1, 1, 0, 0};
int dz[6] = {0, 0, 0, 0, -1, 1};

int main() {
    ios::sync_with_stdio(0); cin.tie(0);

    while (true) {
        int l, r, c;
        cin >> l >> r >> c;
        if (l==0 && r==0 && c==0) break;

        queue<tuple<int, int, int>> Q;

        vector<vector<vector<char>>> board(l, vector<vector<char>>(r, vector<char>(c, ' ')));
        vector<vector<vector<int>>> dist(l, vector<vector<int>>(r, vector<int>(c, -1)));
        
        for (int i = 0; i < l; i++) {
            for (int j = 0; j < r; j++) {
                string str;
                cin >> str;
                for (int k = 0; k < c; k++) {
                    board[i][j][k] = str[k];
                    if (board[i][j][k] == 'S') {
                        Q.push({i, j, k});
                        dist[i][j][k] = 0;
                    }
                }
            }
        }
        
        int answer = 0;
        bool escape = false;

        while (!Q.empty() && !escape) {
            auto cur = Q.front(); Q.pop();
            int x, y, z;
            tie(x, y, z) = cur;
            
            for (int dir = 0; dir < 6; dir++) {
                int nx = x + dx[dir];
                int ny = y + dy[dir];
                int nz = z + dz[dir];
                
                if (nx < 0 || ny < 0 || nz < 0 || nx >= l || ny >= r || nz >= c) continue;
                if (board[nx][ny][nz] == '#' || dist[nx][ny][nz] >= 0) continue;
                
                if (board[nx][ny][nz] == 'E') {
                    answer = dist[x][y][z] + 1;
                    escape = true;
                    break;
                }

                Q.push({nx, ny, nz});
                dist[nx][ny][nz] = dist[x][y][z] + 1;
            }
        }

        if (escape) {
            cout << "Escaped in " << answer << " minute(s).\n";    
        }
        else {
            cout << "Trapped!\n";
        } 
    }
}

 

 

2. 분석

3차원 미로탈출 BFS 문제이다. 입력받을 때 층과 층은 \n 줄바꿈으로 구분해서 이걸 별도로 처리해야하나 생각했는데, cpp에서 cin >> str 은 공백(개행, 스페이스 등)을 모두 무시하고 다음 토큰(여기서는 “문자열”)만 읽어오기 때문에 별도로 처리하지 않아도 된다. 미로 문제에서 dist 배열을 -1로 초기화하면 vis 배열을 생략할 수 있다. 대신 입력을 받을 때 바로 'S'를 발견하면 큐에 push 했는데 이때 dist[i][j][k] = 0으로 반드시 초기화해줘야한다. 이 부분을 빼먹어서 처음에 오류가 발생했었다.

if (nx < 0 || ny < 0 || nz < 0 || nx >= l || ny >= r || nz >= c) continue;
if (board[nx][ny][nz] == '#' || dist[nx][ny][nz] >= 0) continue;

if (board[nx][ny][nz] == 'E') {
    answer = dist[x][y][z] + 1;
    escape = true;
    break;
}

 

범위 바깥으로 나갔는지 여부 체크를 항상 제일 먼저 해줘야한다. 이 순서를 헷갈리면 Out of Bound 의문사를 당할 수 있다. 

 

3. 시간복잡도

시간복잡도는 O(l * r * c)이다. 시간제한은 1초이고, 30 * 30 * 30 = 27000 < 10^8 이므로 충분하다.

 

 

 

'코딩테스트 > BOJ' 카테고리의 다른 글

[BOJ / C++] 부분수열의 합 (백트래킹)  (0) 2025.07.14
[BOJ / C++] N-Queen (백트래킹)  (0) 2025.07.13
[BOJ / C++] 불 (BFS)  (0) 2025.07.13
[BOJ / C++] Z (재귀)  (1) 2025.07.11
[BOJ / C++] 하노이 탑 이동 순서 (재귀)  (0) 2025.07.10
'코딩테스트/BOJ' 카테고리의 다른 글
  • [BOJ / C++] 부분수열의 합 (백트래킹)
  • [BOJ / C++] N-Queen (백트래킹)
  • [BOJ / C++] 불 (BFS)
  • [BOJ / C++] Z (재귀)
sophon
sophon
sophon 님의 블로그 입니다.
  • sophon
    sophon 님의 블로그
    sophon
    • 카테고리 (172) N
      • 컴퓨터공학 (36)
        • 데이터베이스 (19)
        • 네트워크 (15)
        • 기타 이슈 (2)
      • 프로젝트 (16)
        • Java (8)
        • Spring (4)
        • Docker (4)
      • 코딩테스트 (95) N
        • BOJ (74)
        • 프로그래머스 (7)
        • 프로그래머스 SQL (12) N
        • PS Snippets (2)
      • 🌱 잡담 (22)
        • 자격증 (7)
        • 좋은 시 모음 (12)
        • 책과 영화 (3)
        • 기록 (0)
  • 전체
    오늘
    어제
  • 블로그 메뉴

    • 홈
    • 태그
    • 방명록
  • 최근 글

  • hELLO· Designed By정상우.v4.10.6
sophon
[BOJ / C++] 상범 빌딩 (BFS)
상단으로

티스토리툴바