Hamutaro - Hamtaro 4

Algorithm/BOJ

[Silver IV/JAVA] 1388 ๋ฐ”๋‹ฅ์žฅ์‹

carsumin 2024. 12. 10. 17:41

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

 

 

  • '-' ์ด๋Ÿฐ ๋ฌธ์ž๊ฐ€ ๋‚˜์˜ค๋ฉด -> ์ด ๋ฐฉํ–ฅ์œผ๋กœ ํƒ์ƒ‰, '|' ์ด๋Ÿฐ ๋ฌธ์ž๊ฐ€ ๋‚˜์˜ค๋ฉด ↓ ์ด ๋ฐฉํ–ฅ์œผ๋กœ ํƒ์ƒ‰ํ•œ๋‹ค๊ณ  ์ƒ๊ฐํ•˜๋ฉด ๋œ๋‹ค.
  • ์—ฌ๊ธฐ์„œ ์–ด๋–ค ๊ฒฝ์šฐ์— ์ธ์ ‘๋ฆฌ์ŠคํŠธ๋ฅผ ์‚ฌ์šฉํ•˜๊ณ  ์–ด๋–ค ๊ฒฝ์šฐ์— 2์ฐจ์› ๋ฐฐ์—ด์„ ์‚ฌ์šฉํ•˜๋Š”์ง€๊ฐ€ ๊ถ๊ธˆํ•ด์กŒ๋‹ค.
* ์ธ์ ‘ ๋ฆฌ์ŠคํŠธ ์‚ฌ์šฉํ•˜๋Š” ๊ฒฝ์šฐ
- ์ •์ ์ด ๋งŽ๊ณ , ๊ฐ ์ •์ ์— ์—ฐ๊ฒฐ๋œ ๊ฐ„์„ ์˜ ์ˆ˜๊ฐ€ ์ ์„ ๋•Œ
- ์ •์  ์ค‘์‹ฌ์˜ ํƒ์ƒ‰
- ์ž…๋ ฅ์ด ์ •์ -๊ฐ„์„  ๋ชฉ๋ก์œผ๋กœ ์ฃผ์–ด์งˆ ๋•Œ

* 2์ฐจ์› ๋ฐฐ์—ด(๊ทธ๋ฆฌ๋“œ, ์ธ์ ‘ ํ–‰๋ ฌ)์„ ์‚ฌ์šฉํ•˜๋Š” ๊ฒฝ์šฐ
- ์ •์  ๊ฐœ์ˆ˜์— ๋น„ํ•ด ๊ฐ„์„  ๊ฐœ์ˆ˜๊ฐ€ ๋งŽ์„ ๋•Œ ( ์˜ˆ : N x N ํ–‰๋ ฌ์—์„œ ๋ชจ๋“  ์ •์ ์ด ์—ฐ๊ฒฐ๋œ ์™„์ „ ๊ทธ๋ž˜ํ”„ )
- ๊ทธ๋ž˜ํ”„๊ฐ€ 2D ๊ฒฉ์ž ํ˜•ํƒœ์ผ ๋•Œ ( ์˜ˆ : ๋ฏธ๋กœ์ฐพ๊ธฐ, ์„ฌ์˜ ๊ฐœ์ˆ˜, ๊ฒฝ๋กœ ํƒ์ƒ‰ ๋“ฑ )
- ์ •์  ๊ฐ„ ์—ฐ๊ฒฐ ์—ฌ๋ถ€ ์ฒดํฌํ•  ๋•Œ ( ์˜ˆ : ๊ฒฝ๋กœ ์กด์žฌ ํ™•์ธ )
  • ๊ฒฐ๋ก 
    • ๊ทธ๋ž˜ํ”„์˜ ํฌ๊ธฐ์™€ ์—ฐ๊ฒฐ ์ •๋ณด์˜ ๋ฐ€๋„ ํŒŒ์•…
    • ์ •์  ์ˆ˜์™€ ๊ฐ„์„  ์ˆ˜๊ฐ€ ์ ๊ณ  ํƒ์ƒ‰์ด ๊ฒฉ์ž ํ˜•ํƒœ๋ผ๋ฉด? 2์ฐจ์› ๋ฐฐ์—ด
    • ์ •์  ์ˆ˜๊ฐ€ ๋งŽ๊ณ  ๊ฐ„์„ ์ •๋ณด๊ฐ€ ํฌ์†Œํ•˜๋‹ค๋ฉด? ์ธ์ ‘๋ฆฌ์ŠคํŠธ
  • DFS (๊นŠ์ด์šฐ์„ ํƒ์ƒ‰) ๋ฅผ ์ ์šฉํ•ด์„œ ํ’€์ดํ•œ๋‹ค.
    • ์˜ค๋ฅธ์ชฝ ๋ฐฉํ–ฅ์œผ๋กœ ํ–‰์„ ๋”ฐ๋ผ์„œ ํƒ์ƒ‰์„ ์ „๊ฐœํ•˜๋‹ค '|' ๋ฌธ์ž๋ฅผ ๋งŒ๋‚˜๋ฉด ์•„๋ž˜ ๋ฐฉํ–ฅ์œผ๋กœ ์—ด์„ ๋”ฐ๋ผ ํƒ์ƒ‰ํ•œ๋‹ค.
    • 2์ฐจ์› ๋ฐฐ์—ด๋กœ ๋ฐฉ๋ฌธ์—ฌ๋ถ€์™€ ๋ฌธ์ž์—ด์ด ๋‹ด๊ธด ๊ทธ๋ฆฌ๋“œ๋ฅผ ๋งŒ๋“ ๋‹ค.
    • DFS ํƒ์ƒ‰ ๋ฉ”์„œ๋“œ์—์„œ ํ–‰๊ณผ ์—ด์˜ ๋์„ ์ฒดํฌํ•˜๊ธฐ ์œ„ํ•ด N,M ๋ณ€์ˆ˜๋ฅผ ์‚ฌ์šฉํ•ด์•ผ ํ•˜๊ธฐ ๋•Œ๋ฌธ์— static ์ „์—ญ ๋ณ€์ˆ˜๋กœ ์„ ์–ธํ•œ๋‹ค.

 

ํ’€์ด
import java.io.*;
import java.util.*;

public class Main{
    static boolean[][] visited;
    static char[][] graph;
    static int cnt;
    static int N,M;
    
    public static void main(String[] args) throws IOException {
        BufferedReader br = new BufferedReader(new InputStreamReader(System.in));
        
        String[] str = br.readLine().split(" ");
        N = Integer.parseInt(str[0]);
        M = Integer.parseInt(str[1]);
        
        visited = new boolean[N+1][M+1];
        graph = new char[N+1][M+1];
        
        for(int i=1; i<N+1; i++){
            char[] c = br.readLine().toCharArray();
            for(int j=1; j<M+1; j++){
                graph[i][j] = c[j-1];
            }
        }
        
        //๋ฐฉ๋ฌธํƒ์ƒ‰
        for(int i=1; i<N+1; i++){
            for(int j=1; j<M+1; j++){
                if(!visited[i][j]){
                    dfs(i, j);
                }
            }
        }
        
        //์ถœ๋ ฅ
        System.out.println(cnt);
   
    }
    
    //DFS ํƒ์ƒ‰
    private static void dfs(int i, int j){
        visited[i][j] = true;
        
        if(graph[i][j]=='-'){ //->
            if(j==M){ //ํ–‰์˜ ๋์ด๋ฉด
                cnt++;
                return;
            }
            int nextY = j+1;
            if(!visited[i][nextY] && graph[i][nextY] == '-'){ //๋ฐฉ๋ฌธํ•œ์  ์—†๊ณ  '-'์ด๋ฉด
                dfs(i, nextY); //์žฌ๊ท€ํ˜ธ์ถœ
            }else{
                cnt++;
                return;
            }
        }
        
        if(graph[i][j] == '|'){ //↓
            if(i==N){ //์—ด์˜ ๋์ด๋ฉด
                cnt++;
                return;
            }
            
            int nextI = i+1;
            if(!visited[nextI][j] && graph[nextI][j] == '|'){ //๋ฐฉ๋ฌธํ•œ์  ์—†์œผ๋ฉด์„œ '|'์ด๋ฉด
                dfs(nextI, j); //์žฌ๊ท€ํ˜ธ์ถœ
            }else{
                cnt++;
                return;
            }
        }
    }
}