๐ 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
์ ์ฒด ๋ก์ง
- ์ ํด์ง ๋ฐฉํฅ์ ๋ฐ๋ผ์ ๋ฟ์ ์ ์๋ ๊ณณ๋ค์ ํ ๊ทธ๋ฃน์ผ๋ก ๋ฌถ์ด์ค๋ค.
- ๊ทธ๋ฃน ๋น ํ๋์ SAFE ZONE๋ง ์์ผ๋ฉด ๊ทธ๋ฃน ์์ ๋ชจ๋ ์์น์์ SAFE ZONE์ ๋๋ฌํ ์ ์๋ค.
- ๊ทธ๋ฃน์ ๊ฐ์๋ฅผ ์ถ๋ ฅํ๋ค.
→ ๊ทธ๋ฃน์ ๊ฐ์๋ฅผ ์ฐพ๊ธฐ ์ํด 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]);
}
}