본문 바로가기
알고리즘/백준

[Java] BOJ 6593번 상범 빌딩

by 컴공맨 2021. 7. 12.
 

6593번: 상범 빌딩

당신은 상범 빌딩에 갇히고 말았다. 여기서 탈출하는 가장 빠른 길은 무엇일까? 상범 빌딩은 각 변의 길이가 1인 정육면체(단위 정육면체)로 이루어져있다. 각 정육면체는 금으로 이루어져 있어

www.acmicpc.net


풀이

BFS를 이용하여 해결했습니다.

이때, 제 코드에서 Info 클래스의 생성자의 순서는 x, y, z이고 축의 사용은 building[z][y][x] 즉, z는 층, y는 행, x는 열로 사용했어서 주의해야 합니다.


코드

import java.io.BufferedReader;
import java.io.IOException;
import java.io.InputStreamReader;
import java.util.LinkedList;
import java.util.Queue;
import java.util.StringTokenizer;

public class Main {
	public static class Info {
		int x, y, z, time;

		public Info(int x, int y, int z, int time) {
			super();
			this.x = x;
			this.y = y;
			this.z = z;
			this.time = time;
		}
	}
	
	public static int L, R, C, answer;
	public static Info startInfo;
	public static StringBuilder sb;
	public static boolean[][][] visited;
	public static char[][][] building;
	public static void main(String[] args) throws IOException {
		BufferedReader br = new BufferedReader(new InputStreamReader(System.in));
		StringTokenizer st = null;
		
		sb = new StringBuilder("");
		
		while (true) {
			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;
			}
			
			visited = new boolean[L][R][C];
			building = new char[L][R][C];
			
			for (int i = 0; i < L; ++i) {
				for (int j = 0; j < R; ++j) {
					building[i][j] = br.readLine().toCharArray();
					
					for (int k = 0; k < C; ++k) {
						if (building[i][j][k] == 'S') {
							// info의 순서가 x y z 임을 주의
							startInfo = new Info(k, j, i, 0);
							break;
						}
					}
				}
				
				br.readLine();
			}
			
			bfs();
		}
		
		System.out.println(sb);
	}
	
	public static int[] dz = {0, 0, 0, 0, -1, 1};
	public static int[] dy = {-1, 1, 0, 0, 0, 0};
	public static int[] dx = {0, 0, -1, 1, 0, 0};
	
	public static void bfs() {
		Queue<Info> q = new LinkedList<Info>();
		q.offer(new Info(startInfo.x, startInfo.y, startInfo.z, 0));
		visited[startInfo.z][startInfo.y][startInfo.x] = true;
		
		while (!q.isEmpty()) {
			Info info = q.poll();
			
			if (building[info.z][info.y][info.x] == 'E') {
				sb.append("Escaped in ").append(info.time).append(" minute(s).\n");
				return;
			}
			
			for (int i = 0; i < 6; ++i) {
				int nz = info.z + dz[i];
				int ny = info.y + dy[i];
				int nx = info.x + dx[i];
				
				if (nz < 0 || ny < 0 || nx < 0 || nz >= L || ny >= R || nx >= C) {
					continue;
				}
				
				if (!visited[nz][ny][nx] && building[nz][ny][nx] != '#') {
					q.offer(new Info(nx, ny, nz, info.time + 1));
					visited[nz][ny][nx] = true;
				}
			}
		}
		
		sb.append("Trapped!\n");
	}
}

 

pyo7410/Algorithm

1일 1커밋을 목표로! Contribute to pyo7410/Algorithm development by creating an account on GitHub.

github.com

 

'알고리즘 > 백준' 카테고리의 다른 글

[Java] BOJ 17472번 다리 만들기 2  (0) 2021.07.15
[Java] BOJ 5582번 공통 부분 문자열  (2) 2021.07.13
[Java] BOJ 2668번 숫자고르기  (0) 2021.07.09
[Java] BOJ 2981번 검문  (0) 2021.07.08
[Java] BOJ 1038번 감소하는 수  (0) 2021.07.07