๐Ÿ“œ ์ฝ”๋”ฉํ…Œ์ŠคํŠธ/BAEKJOON\BFS, DFS

๋ฐฑ์ค€ 7569๋ฒˆ : ํ† ๋งˆํ†  (JAVA) ๋ฌธ์ œ ํ’€์ด

2021. 6. 26. 00:43
๋ชฉ์ฐจ
  1. โœ๏ธ ๋ฌธ์ œ
  2. ๐Ÿ” ๋ฌธ์ œ ํ•ด๊ฒฐ
  3. ๐Ÿ–ฅ ์ „์ฒด ์ฝ”๋“œ
๋ฐ˜์‘ํ˜•

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

 

7569๋ฒˆ: ํ† ๋งˆํ† 

์ฒซ ์ค„์—๋Š” ์ƒ์ž์˜ ํฌ๊ธฐ๋ฅผ ๋‚˜ํƒ€๋‚ด๋Š” ๋‘ ์ •์ˆ˜ M,N๊ณผ ์Œ“์•„์˜ฌ๋ ค์ง€๋Š” ์ƒ์ž์˜ ์ˆ˜๋ฅผ ๋‚˜ํƒ€๋‚ด๋Š” H๊ฐ€ ์ฃผ์–ด์ง„๋‹ค. M์€ ์ƒ์ž์˜ ๊ฐ€๋กœ ์นธ์˜ ์ˆ˜, N์€ ์ƒ์ž์˜ ์„ธ๋กœ ์นธ์˜ ์ˆ˜๋ฅผ ๋‚˜ํƒ€๋‚ธ๋‹ค. ๋‹จ, 2 โ‰ค M โ‰ค 100, 2 โ‰ค N โ‰ค 100,

www.acmicpc.net


์ด ๋ฌธ์ œ๋Š” ์ด์ „์˜ ํ’€์—ˆ๋˜ 7576๋ฒˆ ํ† ๋งˆํ† ์™€ ๋น„์Šทํ•œ ๋ฌธ์ œ์ด๋‹ค.

์ด ๋ฌธ์ œ์—์„œ์˜ ๋‹ค๋ฅธ ์ ์€ ํ† ๋งˆํ† ๊ฐ€ 2์ฐจ์› ๋ฐฐ์—ด์— ๋‹ด๊ธฐ๋Š”๊ฒŒ ์•„๋‹ˆ๋ผ, 3์ฐจ์› ๋ฐฐ์—ด์— ๋‹ด๊ธฐ๊ธฐ ๋•Œ๋ฌธ์— ์ƒ,ํ•˜,์ขŒ,์šฐ,์•ž,๋’ค๊นŒ์ง€ ์ด 6๋ฒˆ์„ ์ฒดํฌํ•ด์ค˜์•ผํ•œ๋‹ค.

 

โœ๏ธ ๋ฌธ์ œ

 

๐Ÿ” ๋ฌธ์ œ ํ•ด๊ฒฐ

์–ด๋ ค์šธ ๊ฒƒ์ด ์—†๋‹ค. ์ด์ „๊ณผ ๋™์ผํ•œ ๋ฐฉ์‹์œผ๋กœ ์ฒ˜๋ฆฌํ•  ๊ฒƒ์ด๊ณ , ๊ทธ์ € ์ฒดํฌํ•ด์•ผ ํ•  ๊ณณ์ด 2๊ณณ์ด ๋Š˜์—ˆ๋‹ค๋Š” ์  ์™ธ์—๋Š” ๋ง์ด๋‹ค.

ํ† ๋งˆํ† ๋ฅผ ๋‹ด๊ธฐ ์œ„ํ•œ 3์ฐจ์› ๋ฐฐ์—ด์„ ์ƒ์„ฑํ•ด์ค€๋‹ค. (๋‚ ์งœ๋ฅผ ๊ณ„์‚ฐํ•˜๊ธฐ ์œ„ํ•œ days ๋ฐฐ์—ด๋„ ์„ ์–ธํ•ด์ค€๋‹ค.)

int[][][] tomatos = new int[H][N][M];	// ๋†’์ด๊ฐ€ H์ด๊ณ , ๊ฐ€๋กœ๊ฐ€ N, ์„ธ๋กœ๊ฐ€ M
int[][][] days = new int[H][N][M];

 

ํ์— ์ขŒํ‘œ๊ฐ’์„ ๋„ฃ์–ด์ฃผ๊ธฐ์œ„ํ•ด 2์ฐจ์› ํ† ๋งˆํ†  ๋ฌธ์ œ์—์„œ๋Š” Pair๋ผ๋Š” ํด๋ž˜์Šค๋ฅผ ์ƒ์„ฑํ–ˆ์ง€๋งŒ, ์ด๋ฒˆ์—๋Š” 3์ฐจ์›์ด๊ธฐ ๋•Œ๋ฌธ์— Triple์ด๋ผ๋Š” ํด๋ž˜์Šค๋ฅผ ์ƒ์„ฑํ•˜๋„๋ก ํ•˜๊ฒ ๋‹ค.

public static class Triple{
	int x, y, z;
    
    public Triple(int x, int y, int z){
    	this.x = x;
        this.y = y;
        this.z = z;
    }
    
    // getter,setter ์ƒ๋žต
}

 

๊ทธ๋ฆฌ๊ณ  ์ด์ „์—๋Š” dx, dy ์ขŒํ‘œ๋ฅผ ๋ฏธ๋ฆฌ ์„ ์–ธํ•ด๋‘์—ˆ์ง€๋งŒ, ์ด๋ฒˆ์—๋Š” dz ๊นŒ์ง€ ๋ฏธ๋ฆฌ ์„ ์–ธ์„ ํ•ด๋‘์ž.

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

 

์ด์ œ ์ž…๋ ฅ์„ ๋ฐ›์Œ๊ณผ ๋™์‹œ์— ํ† ๋งˆํ† ๊ฐ€ ์ต์—ˆ์œผ๋ฉด (๊ฐ’์ด 1์ด๋ฉด) ํ์— ๋„ฃ์–ด์ฃผ๊ณ , days ๋ฐฐ์—ด์˜ ๊ฐ’์„ 0์œผ๋กœ ๋ณ€๊ฒฝํ•ด์ค€๋‹ค.

๋งŒ์ผ, 0์ด๊ฑฐ๋‚˜ -1์ธ ๊ฒฝ์šฐ์—๋Š” days๋ฐฐ์—ด์— -1 ๊ฐ’์„ ๋„ฃ์–ด์ค€๋‹ค.

for(int p=0; p<H; p++){
	for(int i=0; i<N; i++){
    	StringTokenizer st = new StringTokenizer(bf.readLine());
    	for(int j=0; j<M; j++){
            tomatos[p][i][j] = Integer.parseInt(st.nextToken());
            
            if(tomatos[p][i][j] == 1) {
            	qu.offer(new Triple(p, i, j));	// Triple์ด๋ผ๋Š” ํด๋ž˜์Šค์— ๊ฐ€๋กœ,์„ธ๋กœ,๋†’์ด๋ฅผ ์ €์žฅ!
                days[p][i][j] = 0;	// 0์œผ๋กœ ์„ค์ •!
            }else{
            	days[p][i][j] = -1;	// -1์œผ๋กœ ์„ค์ •!
                if(tomatos[p][i][j] == 0){
                	notYet++;	// ์•ˆ์ต์€ ํ† ๋งˆํ† ์˜ ๊ฐœ์ˆ˜ ์ฆ๊ฐ€
                }
            }
        }
    }
}

 

์ด์ œ ๊ฐ€์žฅ ์ค‘์š”ํ•œ ๋ถ€๋ถ„์ธ BFS ํƒ์ƒ‰์„ ํ•˜๋Š” ์ฝ”๋“œ์ด๋‹ค. ์ด์ „๊ณผ ๋‹ฌ๋ผ์ง„ ์ ์€ ์—†๋‹ค.

// BFS!
while(!qu.isEmpty()){
    Triple t = qu.poll();
    
    for(int i = 0; i < 6; i++){		// ์ด์ œ๋Š” ์ƒํ•˜์ขŒ์šฐ์•ž๋’ค๊นŒ์ง€ ํƒ์ƒ‰ํ•ด์ค€๋‹ค.
        int nX = t.x + dx[i];
        int nY = t.y + dy[i];
        int nZ = t.z + dz[i];
        
        // ๋ฒฝ์— ๋ถ€๋”ชํžˆ๊ฑฐ๋‚˜, ๋ฒ”์œ„๋ฅผ ๋ฒ—์–ด๋‚˜๋Š” ์ขŒํ‘œ๋Š” PASS
        if(nX < 0 || nX >= N || nY < 0 || nY >= M || nZ < 0 || nZ >= H){
            continue;
        }
        
        // ํ† ๋งˆํ† ๊ฐ€ ๋งŒ์•ฝ ์—†๊ฑฐ๋‚˜, ์ด๋ฏธ ๋ฐฉ๋ฌธํ•œ ํ† ๋งˆํ† ๋Š” PASS
        if(tomatos[nZ][nX][nY] == -1 || days[nZ][nX][nY] != -1){
            continue;
        }
        
        // ์ต์€ ํ† ๋งˆํ† ์™€ ์ธ์ ‘ํ•œ ์ต์ง€ ์•Š์€ ํ† ๋งˆํ† ๋“ค์„ ํ์— ๋„ฃ์–ด์ฃผ๊ณ  ์ต์ง€ ์•Š์€ ํ† ๋งˆํ† ์˜ ๊ฐœ์ˆ˜ -1 ํ•ด์ค€๋‹ค.
        qu.offer(new Triple(nX, nY, nZ)); notYet--;
        days[nZ][nX][nY] = days[t.z][t.x][t.y] + 1;
        
        if(days[nZ][nX][nY] > result){
            result = days[nZ][nX][nY];
        }
    }
}

 

 

๐Ÿ–ฅ ์ „์ฒด ์ฝ”๋“œ

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

public class Main {
    public static void main(String args[]) throws IOException {
      BufferedReader bf = new BufferedReader(new InputStreamReader(System.in));
      
      StringTokenizer st = new StringTokenizer(bf.readLine());
      int M = Integer.parseInt(st.nextToken());
      int N = Integer.parseInt(st.nextToken());
      int H = Integer.parseInt(st.nextToken());
      int notYet = 0;
      int result = 0;
      
      int[][][] days = new int[H][N][M];        // ๋‚ ์งœ๋ฅผ ๊ณ„์‚ฐํ•˜๋Š” 3์ฐจ์›๋ฐฐ์—ด
      int[][][] tomatos = new int[H][N][M];   // ํ† ๋งˆํ† ์˜ ์ƒํƒœ๋ฅผ ์ €์žฅํ•˜๋Š” 3์ฐจ์›๋ฐฐ์—ด
      int[] dx = {1, 0, -1, 0, 0, 0};
      int[] dy = {0, 1, 0, -1, 0, 0};
      int[] dz = {0, 0, 0, 0, 1, -1};
      
      Queue<Triple> qu = new LinkedList<>();
      
      for(int p=0; p<H; p++){
          for(int i=0; i<N; i++){
              st = new StringTokenizer(bf.readLine());
              for(int j=0; j<M; j++){
                  tomatos[p][i][j] = Integer.parseInt(st.nextToken());
                  if(tomatos[p][i][j] == 1){
                      qu.offer(new Triple(i, j, p));
                      days[p][i][j] = 0;
                  }else{
                      days[p][i][j] = -1;
                      if(tomatos[p][i][j] == 0){
                          notYet++;
                      }
                  }
              }
          }
      }
      
      if(notYet == 0){
          System.out.print(0);
          System.exit(0);
      }
      
      while(!qu.isEmpty()){
          Triple t = qu.poll();
          
          for(int i = 0; i < 6; i++){
              int nX = t.x + dx[i];
              int nY = t.y + dy[i];
              int nZ = t.z + dz[i];
              
              if(nX < 0 || nX >= N || nY < 0 || nY >= M || nZ < 0 || nZ >= H){
                  continue;
              }
              
              if(tomatos[nZ][nX][nY] == -1 || days[nZ][nX][nY] != -1){
                  continue;
              }
              
              qu.offer(new Triple(nX, nY, nZ)); notYet--;
              days[nZ][nX][nY] = days[t.z][t.x][t.y] + 1;
              
              if(days[nZ][nX][nY] > result){
                  result = days[nZ][nX][nY];
              }
          }
      }
      
      if(notYet > 0){
          System.out.print(-1);
      }else{
          System.out.print(result);
      }
    }
    
    public static class Triple {
        int x,  y,  z;
        
        public Triple(int x, int y, int z){
            this.x = x;
            this.y = y;
            this.z = z;
        }
        
        public int getX(){
            return x;
        }
        
        public int getY(){
            return y;
        }
        
        public int getZ(){
            return z;
        }
        
        public void setX(int x){
            this.x = x;
        }
        
        public void setY(int y){
            this.y = y;
        }
        
        public void setZ(int z){
            this.z = z;
        }
    }
}
๋ฐ˜์‘ํ˜•
์ €์ž‘์žํ‘œ์‹œ (์ƒˆ์ฐฝ์—ด๋ฆผ)
  1. โœ๏ธ ๋ฌธ์ œ
  2. ๐Ÿ” ๋ฌธ์ œ ํ•ด๊ฒฐ
  3. ๐Ÿ–ฅ ์ „์ฒด ์ฝ”๋“œ
'๐Ÿ“œ ์ฝ”๋”ฉํ…Œ์ŠคํŠธ/BAEKJOON\BFS, DFS' ์นดํ…Œ๊ณ ๋ฆฌ์˜ ๋‹ค๋ฅธ ๊ธ€
  • ๋ฐฑ์ค€ 9466๋ฒˆ : ํ…€ ํ”„๋กœ์ ํŠธ (JAVA) ๋ฌธ์ œ ํ’€์ด
  • ๋ฐฑ์ค€ 2206๋ฒˆ : ๋ฒฝ ๋ถ€์ˆ˜๊ณ  ์ด๋™ํ•˜๊ธฐ (JAVA) ๋ฌธ์ œ ํ’€์ด
  • ๋ฐฑ์ค€ 7576๋ฒˆ : ํ† ๋งˆํ†  (JAVA) ๋ฌธ์ œ ํ’€์ด
  • ๋ฐฑ์ค€ 2178๋ฒˆ : ๋ฏธ๋กœ ํƒ์ƒ‰ (JAVA) ๋ฌธ์ œ ํ’€์ด
iseunghan
iseunghan
๊พธ์ค€ํ•˜๊ฒŒ ์—ด์‹ฌํžˆ..
iseunghan
iseunghan

๊ณต์ง€์‚ฌํ•ญ

  • ์–ด์ œ๋ณด๋‹ค ๋‚˜์€ ์˜ค๋Š˜์ด ๋˜๊ธฐ ์œ„ํ•ด ๐Ÿ”ฅ
  • ๋ถ„๋ฅ˜ ์ „์ฒด๋ณด๊ธฐ (261)
    • ๐Ÿ’ Spring (14)
      • ๊ฐœ๋… ๋ฐ ์ดํ•ด (2)
      • Spring ํ•ต์‹ฌ ๊ธฐ์ˆ  (24)
      • Spring REST API (8)
      • Spring MVC, DB ์ ‘๊ทผ ๊ธฐ์ˆ  (7)
      • Spring Security (23)
      • Spring in Action (1)
    • ๐ŸŒป JAVA (84)
      • ์ž๋ฐ” ORM ํ‘œ์ค€ JPA ํ”„๋กœ๊ทธ๋ž˜๋ฐ (20)
      • ์•Œ๊ณ ๋ฆฌ์ฆ˜, ์ž๋ฃŒ๊ตฌ์กฐ (13)
      • ๋””์ž์ธ ํŒจํ„ด (7)
      • ์ •๋ฆฌ์ •๋ฆฌ์ •๋ฆฌ (43)
      • JUnit (1)
    • ๐Ÿ”– Snippets (3)
      • Javascript (3)
    • โš™๏ธ Devops (22)
      • โ› Git (11)
      • ๐Ÿณ Docker (6)
      • ๐Ÿง Linux (3)
      • ๐ŸŒˆ Jenkins (1)
      • ๐Ÿ“ฌ Kafka (1)
    • ๐Ÿ’ฌ ETC.. (4)
      • ๐Ÿ’ป macOS (2)
    • ๐ŸŒง๏ธ ORM (2)
      • JPA (2)
    • ๐Ÿ Python (2)
    • ๐Ÿ“š Databases (15)
      • ์˜ค๋ผํด๋กœ ๋ฐฐ์šฐ๋Š” ๋ฐ์ดํ„ฐ๋ฒ ์ด์Šค ๊ฐœ๋ก ๊ณผ ์‹ค์Šต(2ํŒ) (3)
      • RealMySQL 8.0 (8)
    • ๐Ÿ”ฅ Computer Science (5)
      • ๐Ÿ“ก ๋„คํŠธ์›Œํฌ (5)
    • ๐Ÿท๏ธ ํ˜‘์—… (1)
    • ๐Ÿ“œ ์ฝ”๋”ฉํ…Œ์ŠคํŠธ (38)
      • BAEKJOON\์ˆ˜ํ•™ 1, ์ˆ˜ํ•™ 2 (8)
      • BAEKJOON\์žฌ๊ท€ (5)
      • BAEKJOON\๋ธŒ๋ฃจํŠธ ํฌ์Šค (3)
      • BAEKJOON\์ •๋ ฌ (1)
      • BAEKJOON\๋ฐฑํŠธ๋ž˜ํ‚น (5)
      • BAEKJOON\BFS, DFS (6)
      • BAEKJOON\์ด๋ถ„ํƒ์ƒ‰ (1)
      • BAEKJOON\๋‹ค์ด๋‚˜๋ฏน ํ”„๋กœ๊ทธ๋ž˜๋ฐ (9)
      • BAEKJOON\๊ทธ๋ฆฌ๋”” ์•Œ๊ณ ๋ฆฌ์ฆ˜ (0)
    • โœจ ISEUNGHAN (1)

์ธ๊ธฐ ๊ธ€

์ตœ๊ทผ ๊ธ€

์ „์ฒด
์˜ค๋Š˜
์–ด์ œ
๋ฐ˜์‘ํ˜•
hELLO ยท Designed By ์ •์ƒ์šฐ.
iseunghan
๋ฐฑ์ค€ 7569๋ฒˆ : ํ† ๋งˆํ†  (JAVA) ๋ฌธ์ œ ํ’€์ด
์ƒ๋‹จ์œผ๋กœ

ํ‹ฐ์Šคํ† ๋ฆฌํˆด๋ฐ”

๊ฐœ์ธ์ •๋ณด

  • ํ‹ฐ์Šคํ† ๋ฆฌ ํ™ˆ
  • ํฌ๋Ÿผ
  • ๋กœ๊ทธ์ธ

๋‹จ์ถ•ํ‚ค

๋‚ด ๋ธ”๋กœ๊ทธ

๋‚ด ๋ธ”๋กœ๊ทธ - ๊ด€๋ฆฌ์ž ํ™ˆ ์ „ํ™˜
Q
Q
์ƒˆ ๊ธ€ ์“ฐ๊ธฐ
W
W

๋ธ”๋กœ๊ทธ ๊ฒŒ์‹œ๊ธ€

๊ธ€ ์ˆ˜์ • (๊ถŒํ•œ ์žˆ๋Š” ๊ฒฝ์šฐ)
E
E
๋Œ“๊ธ€ ์˜์—ญ์œผ๋กœ ์ด๋™
C
C

๋ชจ๋“  ์˜์—ญ

์ด ํŽ˜์ด์ง€์˜ URL ๋ณต์‚ฌ
S
S
๋งจ ์œ„๋กœ ์ด๋™
T
T
ํ‹ฐ์Šคํ† ๋ฆฌ ํ™ˆ ์ด๋™
H
H
๋‹จ์ถ•ํ‚ค ์•ˆ๋‚ด
Shift + /
โ‡ง + /

* ๋‹จ์ถ•ํ‚ค๋Š” ํ•œ๊ธ€/์˜๋ฌธ ๋Œ€์†Œ๋ฌธ์ž๋กœ ์ด์šฉ ๊ฐ€๋Šฅํ•˜๋ฉฐ, ํ‹ฐ์Šคํ† ๋ฆฌ ๊ธฐ๋ณธ ๋„๋ฉ”์ธ์—์„œ๋งŒ ๋™์ž‘ํ•ฉ๋‹ˆ๋‹ค.