티스토리 뷰
생각
Github - https://github.com/hellojdh/Code/blob/master/src/baekjoon/q1000/Q6593.java 상범이가 빌딩을 탈출할 수 있다면 양식에 맞춰 최단 시간을 출력하고 탈출할 수 없다면 탈출 불가일 때의 문자를 출력하여라.
처음 생각
이전에 풀었던 문제인 [백준] 7569번 토마토 와 비슷하게 풀어볼 수 있는 문제이다.
다음 생각
여러개의 케이스가 주어지고 입력이 조금 특이하게 라인 단위로 띄워져 있기 때문에 입력을 받을 때 이부분을 조심해야한다.
다다음 생각
3차원 적으로 생각을 해야하기에 3차원 배열을 생성해서 길을 찾아갈 수 있도록 해주었다.
▶ 다차원 배열은 메모리를 많이 잡아먹기 때문에 따로 visited 배열을 만들어 주지않고, 원본 배열을 갈 수 있는 길인 '.'을 '#'로 바꿔주어 방문처리를 해주었다.
다다다음 생각
3차원 배열로 빌딩의 상태를 모두 받았다면 queue를 이용해서 BFS 탐색을 통해 최단거리로 탈출구를 만날 수 있는가를 판단해주었고, BFS 탐색이 끝나서 while문을 빠져나온 경우는 탈출에 실패한 경우이므로 탈출 불가를 출력해주었다.
다다다다음 생각
배열로 쓸 queue를 생성할 때는 맵의 크기가 최대 30*30*30이므로 그보다 큰 값으로 적당히 만들어 주었다.
방안
1) Java 풀이
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 | package baekjoon.q1000; import java.io.BufferedReader; import java.io.InputStreamReader; import java.util.StringTokenizer; public class Q6593 { static int l,r,c; static int[][] q = new int[29000][3]; static int[][][] arr = new int[30][30][30]; static int[] dx = {1,0,-1,0,0,0}; static int[] dy = {0,1,0,-1,0,0}; static int[] dz = {0,0,0,0,1,-1}; public static void main(String[] args) throws Exception{ BufferedReader br = new BufferedReader(new InputStreamReader(System.in)); StringBuilder sb = new StringBuilder(); xx: 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) { break; } int sx = 0,sy = 0, sz = 0; for(int i=0;i<l;i++) { for(int j=0;j<r;j++) { String t = br.readLine(); for(int k=0;k<c;k++) { char tt = t.charAt(k); arr[i][j][k] = tt; if(tt=='S') { sx = j; sy = k; sz = i; } } } br.readLine(); } int front = 0,rear = 0; q[++rear][0] = sx; q[rear][1] = sy; q[rear][2] = sz; int time = 0; while(front<rear) { time++; int size = rear-front; for(int i=0;i<size;i++) { int x = q[++front][0]; int y = q[front][1]; int z = q[front][2]; for(int j=0;j<6;j++) { int tx = x+dx[j]; int ty = y+dy[j]; int tz = z+dz[j]; if(tx<0||ty<0||tz<0||tx>=r||ty>=c||tz>=l) continue; if(arr[tz][tx][ty]!='#') { if(arr[tz][tx][ty]=='E') { sb.append(String.format("Escaped in %d minute(s).", time)).append('\n'); continue xx; } q[++rear][0] = tx; q[rear][1] = ty; q[rear][2] = tz; arr[tz][tx][ty] = '#'; } } } }// end of while(front<rear) sb.append("Trapped!").append('\n'); }// end of while(true) System.out.println(sb); }// end of main } // end of class |
'알고리즘 > 백준' 카테고리의 다른 글
[백준] 15552번 빠른 A+B (2) | 2018.12.11 |
---|---|
[백준] 1978번 소수 찾기 (0) | 2018.12.10 |
[백준] 1476번 날짜 계산 (0) | 2018.12.09 |
[백준] 4673번 셀프 넘버 (0) | 2018.12.07 |
[백준] 9095번 1, 2, 3 더하기(DP) (0) | 2018.12.06 |
댓글
공지사항
최근에 올라온 글
최근에 달린 댓글
- Total
- Today
- Yesterday