[Java, Python]_6593_상범빌딩

hanseungjune·2023년 7월 20일
0

알고리즘

목록 보기
29/33
post-thumbnail

자바

import java.io.*;
import java.util.*;

public class Sangbum_building_6593 {
    static int[] dz = {1, -1, 0, 0, 0, 0};
    static int[] dy = {0, 0, 1, -1, 0, 0};
    static int[] dx = {0, 0, 0, 0, 1, -1};
    static int l, r, c;
    static char[][][] building;
    static int[][][] visited;
    public static void main(String[] args) throws IOException {
        BufferedReader br = new BufferedReader(new InputStreamReader(System.in));
        while (true) {
            StringTokenizer st = new StringTokenizer(br.readLine());
            l = Integer.parseInt(st.nextToken());
            r = Integer.parseInt(st.nextToken());
            c = Integer.parseInt(st.nextToken());

            if (l == 0 && r == 0 && c == 0) {
                break;
            }

            building = new char[l][r][c];
            visited = new int[l][r][c];

            for (int z = 0; z < l; z++){
                for (int y = 0; y < r; y++ ) {
                    building[z][y] = br.readLine().toCharArray();
                    Arrays.fill(visited[z][y], 0);
                }
                br.readLine();
            }

            for (int z = 0; z < l; z++){
                for (int y = 0; y < r; y++){
                    for (int x = 0; x < c; x++){
                        if (building[z][y][x] == 'S') {
                            bfs(z, y, x);
                        }
                    }
                }
            }
        }
    }

    public static void bfs(int z, int y, int x) {
        Queue<int[]> queue = new LinkedList<>();
        queue.offer(new int[]{z, y, x});
        visited[z][y][x] = 1;

        while (!queue.isEmpty()) {
            int[] cur = queue.poll();
            z = cur[0];
            y = cur[1];
            x = cur[2];
            for (int i = 0; i < 6; i++){
                int nz = z + dz[i];
                int ny = y + dy[i];
                int nx = x + dx[i];
                if (0<=nz && nz<l && 0<=ny && ny<r && 0<=nx && nx<c) {
                    if (building[nz][ny][nx] == 'E'){
                        System.out.println("Escaped in "+ visited[z][y][x] + " minute(s).");
                        return;
                    }
                    if (building[nz][ny][nx] == '.' && visited[nz][ny][nx] == 0){
                        visited[nz][ny][nx] = visited[z][y][x] + 1;
                        queue.offer(new int[]{nz, ny, nx});
                    }
                }
            }
        }
        System.out.println("Trapped!");
    }
}

로직

이 Java 코드는 특정 건물의 내부를 탐색하는 문제를 해결하기 위한 것입니다. 그러면서 3차원 공간에서의 너비 우선 탐색(BFS, Breadth-First Search) 알고리즘을 사용하고 있습니다.

본 코드의 주요 구성요소를 좀 더 자세히 살펴보겠습니다:

dz, dy, dx: 이는 3차원 좌표계를 이동하기 위한 방향 벡터들입니다. 각각의 배열은 z(높이), y(세로), x(가로)축에 따른 이동 값을 가집니다. dz를 통해 위아래로, dy를 통해 앞뒤로, dx를 통해 좌우로 이동 가능합니다.

l, r, c: 이는 건물의 크기를 의미합니다. l은 층 수, r과 c는 각 층의 행과 열의 수를 나타냅니다.

building과 visited: building은 건물의 각 위치에 대한 정보를 저장하는 3차원 문자 배열이고, visited는 BFS에서 이미 방문한 위치인지를 체크하는데 사용하는 3차원 정수 배열입니다.

bfs: 이는 너비 우선 탐색(BFS)을 수행하는 메소드입니다. 주어진 출발점에서 시작하여, 'E'로 표시된 탈출구를 찾아갑니다. 만약 탈출구를 찾게 되면, 거기까지 도달하는데 필요했던 시간을 출력하고 종료됩니다. 만약 탐색을 다 마쳤는데도 탈출구를 찾지 못했다면 "Trapped!"를 출력하게 됩니다.

main: 사용자로부터 입력을 받아 건물의 크기와 각 위치의 정보를 설정하고, 'S'로 표시된 출발점에서 BFS를 시작합니다. l, r, c가 모두 0이 입력되면 프로그램이 종료됩니다.

이 코드를 간략하게 요약하자면, 주어진 건물의 3차원 공간에서 'S'로 표시된 출발점에서 'E'로 표시된 탈출구까지의 최단 시간을 찾는 문제를 해결하는 것입니다. 이 때 BFS 알고리즘을 사용하여 탈출 경로를 찾습니다.

파이썬

from collections import deque
import sys
input = sys.stdin.readline

dz = [1, -1, 0, 0, 0, 0]
dy = [0, 0, 1, -1, 0, 0]
dx = [0, 0, 0, 0, 1, -1]

def bfs(z, y, x):
    queue.append((z, y, x))
    visited[z][y][x] = 1
    while queue:
        z, y, x = queue.popleft()
        for i in range(6):
            nz = z + dz[i]
            ny = y + dy[i]
            nx = x + dx[i]
            if 0 <= nz < l and 0 <= ny < r and 0 <= nx < c:
                if building[nz][ny][nx] == 'E':
                    print(f'Escaped in {visited[z][y][x]} minute(s).')
                    return
                if building[nz][ny][nx] == '.' and visited[nz][ny][nx] == 0:
                    visited[nz][ny][nx] = visited[z][y][x] + 1
                    queue.append((nz, ny, nx))
    print("Trapped!")
                    
while True:
    l, r, c = map(int, input().split())
    if l == 0 and r == 0 and c == 0:
        break
    
    building = []
    queue = deque()
    visited = [[[0]*c for _ in range(r)] for __ in range(l)]
    
    for i in range(l):
        floor = [list(input()) for _ in range(r)]
        building.append(floor)
        input()
    for z in range(l):
        for y in range(r):
            for x in range(c):
                if building[z][y][x] == 'S':
                    bfs(z, y, x)
profile
필요하다면 공부하는 개발자, 한승준

1개의 댓글

comment-user-thumbnail
2023년 7월 20일

잘 읽었습니다. 좋은 정보 감사드립니다.

답글 달기
Powered by GraphCDN, the GraphQL CDN