๐Ÿ”‘ Problem Solving/๐Ÿ‡ BOJ

[JAVA] BOJ ๋ฐฑ์ค€ 16724 ํ”ผ๋ฆฌ ๋ถ€๋Š” ์‚ฌ๋‚˜์ด

snowball๐Ÿฐ 2023. 3. 29. 11:40

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

 

16724๋ฒˆ: ํ”ผ๋ฆฌ ๋ถ€๋Š” ์‚ฌ๋‚˜์ด

์ฒซ ๋ฒˆ์งธ ์ค„์— ์ง€๋„์˜ ํ–‰์˜ ์ˆ˜๋ฅผ ๋‚˜ํƒ€๋‚ด๋Š” N(1 ≤ N ≤ 1,000)๊ณผ ์ง€๋„์˜ ์—ด์˜ ์ˆ˜๋ฅผ ๋‚˜ํƒ€๋‚ด๋Š” M(1 ≤ M ≤ 1,000)์ด ์ฃผ์–ด์ง„๋‹ค. ๋‘ ๋ฒˆ์งธ ์ค„๋ถ€ํ„ฐ N๊ฐœ์˜ ์ค„์— ์ง€๋„์˜ ์ •๋ณด๋ฅผ ๋‚˜ํƒ€๋‚ด๋Š” ๊ธธ์ด๊ฐ€ M์ธ ๋ฌธ์ž์—ด์ด ์ฃผ

www.acmicpc.net

 

์ „์ฒด ๋กœ์ง

  1. ์ •ํ•ด์ง„ ๋ฐฉํ–ฅ์„ ๋”ฐ๋ผ์„œ ๋‹ฟ์„ ์ˆ˜ ์žˆ๋Š” ๊ณณ๋“ค์€ ํ•œ ๊ทธ๋ฃน์œผ๋กœ ๋ฌถ์–ด์ค€๋‹ค.
  2. ๊ทธ๋ฃน ๋‹น ํ•˜๋‚˜์˜ SAFE ZONE๋งŒ ์žˆ์œผ๋ฉด ๊ทธ๋ฃน ์•ˆ์˜ ๋ชจ๋“  ์œ„์น˜์—์„œ SAFE ZONE์— ๋„๋‹ฌํ•  ์ˆ˜ ์žˆ๋‹ค.
  3. ๊ทธ๋ฃน์˜ ๊ฐœ์ˆ˜๋ฅผ ์ถœ๋ ฅํ•œ๋‹ค.

→ ๊ทธ๋ฃน์˜ ๊ฐœ์ˆ˜๋ฅผ ์ฐพ๊ธฐ ์œ„ํ•ด union find๋ฅผ ์‚ฌ์šฉํ•˜์˜€๋‹ค. ๊ทธ๋Ÿฌ๋‚˜ BFS, DFS๋ฅผ ์‚ฌ์šฉํ•ด๋„ ๋  ๊ฒƒ ๊ฐ™๋‹ค!(๋‹ค์Œ์— ํ’€์–ด๋ณด๊ฒ ๋‹ค….)

์œ ์˜ํ•ด์•ผํ•  ์ ์€ p์˜ index์ด๋‹ค. ์ด์ฐจ์› ๋ฐฐ์—ด์„ ์‚ฌ์šฉํ•˜๋ฉด ์ฒ˜๋ฆฌ๊ฐ€ ๋ณต์žกํ•ด์งˆ ๊ฒƒ ๊ฐ™์•„์„œ 1์ฐจ์› ๋ฐฐ์—ด๋กœ ์„ ์–ธํ•˜์˜€๊ณ  ์ด๋•Œ index๋ฅผ ์กฐ์‹ฌํ•ด์„œ ๋„ฃ์–ด์ฃผ์–ด์•ผ ํ•œ๋‹ค!

์˜ˆ์ œ๋Š” N, M์ด ๊ฐ™์œผ๋ฏ€๋กœ ์œ ๋…ํ•˜์ž!

์ „์ œ ์ฝ”๋“œ

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

public class Main{
	static int[] p;
	static int N;
	static int M;
	static char[][] map;
    public static void main(String args[]) throws Exception{
        BufferedReader bf = new BufferedReader(new InputStreamReader(System.in));
        StringTokenizer st = new StringTokenizer(bf.readLine(), " ");
        N = Integer.parseInt(st.nextToken());
        M = Integer.parseInt(st.nextToken());
        p = new int[N*M];
        map = new char[N][M];
        for(int i=0; i<N; i++) {
        	String s = bf.readLine();
        	for(int j=0; j<M; j++) {
        		map[i][j] = s.charAt(j);
        		p[i*M+j] = i*M+j;
        	}
        }
        
        for(int i=0; i<N; i++) {
        	for(int j=0; j<M; j++) {
        		int ni = i; int nj = j;
        		if(map[i][j] == 'U') 	  ni--;
        		else if(map[i][j] == 'D') ni++;
        		else if(map[i][j] == 'R') nj++;
        		else 					  nj--;
        		union(i*M+j, ni*M+nj);
        	}
        }
        Set<Integer> set = new HashSet<>();
        for(int i=0; i<N; i++)
        	for(int j=0; j<M; j++)
        		set.add(find_parent(i*M+j));
        System.out.println(set.size());
        
    }
    static void union(int a, int b) {
    	int A = find_parent(a);
    	int B = find_parent(b);
    	if(A < B) p[B] = A;
    	else p[A] = B;
    }
    static int find_parent(int a) {
    	if(p[a] == a) return a;
    	else return p[a] = find_parent(p[a]);
    }

}