https://www.acmicpc.net/problem/16724
16724번: 피리 부는 사나이
첫 번째 줄에 지도의 행의 수를 나타내는 N(1 ≤ N ≤ 1,000)과 지도의 열의 수를 나타내는 M(1 ≤ M ≤ 1,000)이 주어진다. 두 번째 줄부터 N개의 줄에 지도의 정보를 나타내는 길이가 M인 문자열이 주
www.acmicpc.net
문제
코드
import java.io.*;
import java.util.*;
public class Main {
private static final BufferedReader bf = new BufferedReader(new InputStreamReader(System.in));
private static final BufferedWriter bw = new BufferedWriter(new OutputStreamWriter(System.out));
private static int n, m;
private static int[][] map;
private static int[][] group;
private static int[] dx = {-1, 1, 0, 0};
private static int[] dy = {0, 0, -1, 1};
private static int cnt = 0;
public static void main(String[] args) throws IOException {
StringTokenizer st = new StringTokenizer(bf.readLine());
n = Integer.parseInt(st.nextToken());
m = Integer.parseInt(st.nextToken());
map = new int[n][m];
group = new int[n][m];
for(int i = 0 ; i < n ; i++) {
String str = bf.readLine();
for(int j = 0 ; j < m ; j++) {
char c = str.charAt(j);
if(c == 'U') map[i][j] = 0;
else if(c == 'D') map[i][j] = 1;
else if(c == 'L') map[i][j] = 2;
else map[i][j] = 3;
group[i][j] = -1;
}
}
for(int i = 0 ; i < n ; i++) {
for(int j = 0 ; j < m ; j++) {
if(group[i][j] == -1) {
// 현재 노드에 해당하는 숫자로 루트 초기화
group[i][j] = i * m + j;
dfs(i, j);
}
}
}
bw.write(cnt + "\n");
bf.close();
bw.flush();
bw.close();
}
public static void dfs(int x, int y) {
int nx = x + dx[map[x][y]];
int ny = y + dy[map[x][y]];
if(nx < 0 || ny < 0 || nx >= n || ny >= m) return;
// 아직 방문하지 않은 곳
if(group[nx][ny] == -1) {
// 현재 그룹의 루트 노드를 다음 노드에 넣어 루트를 나타냄
group[nx][ny] = group[x][y];
dfs(nx, ny);
} else {
// 이때 group[x][y]에 루트값이 있음, 현재 탐색하려는 노드와 다음 노드의 루트가 같음
if(group[x][y] == group[nx][ny]) {
cnt ++;
return;
}
// 다음노드를 보니 루트가 존재함 (이때는 group[x][y] 에 루트값이 존재하지 않음)
group[x][y] = group[nx][ny];
}
}
}
뭔가 야매로 한 분리집합이 되어버렸네요.. 그래도 부모 노드 쓰고 하는 건 일맥상통하지 않나.. 라고... 말을 해봅니다..ㅋㅋㅋ
'코딩테스트' 카테고리의 다른 글
[백준] 1113번 '수영장 만들기' - Python (2) | 2023.12.22 |
---|---|
[백준] 2252번 '줄 세우기' - Java (1) | 2023.09.03 |
[백준] 1135번 '뉴스 전하기' - Java (0) | 2023.08.31 |
[백준] 1038번 '감소하는 수' - Java (0) | 2023.08.30 |
[백준] 1355번 '구멍난 케이크 자르기' - Java (0) | 2023.08.29 |