알고리즘 문제) BOJ15559. 내 선물을 받아줘
15559번: 내 선물을 받아줘
첫째 줄에 지도의 세로 크기 N과 가로 크기 M이 주어진다. (1 ≤ N, M ≤ 1,000, 1 < N×M ≤ 1,000,000) 둘째 줄부터 N개의 줄에는 구사과가 있는 곳의 지도가 주어진다. 지도에 쓰여 있는대로 이동했을
www.acmicpc.net
문제 요약
- N*M지도가 있다
- 지도 각 칸에는 N,W,E,S가 적혀있다.
- N : (i-1,j)
- S : (i+1,j)
- W : (i,j-1)
- S : (i,j+1)
- 해당 위치로 순간이동
- 구사과는 (i,j)에 위치해있고, 계속 이동한다.
- 위치에 관계없이 최소 몇 개의 칸위에 선물을 놓아야 항상 선물을 가져갈까?
시간 제한
- 2초
입력
- N*M
- 1≤N,M≤1,000
- 1<N*M≤100만
- N개의 줄에 지도가 주어진다.
- 지도를 벗어나는 경우는 없다.
출력
- 최소 몇 개의 칸에 선물을 놓아야 할 까?
접근법
- 피리부는 사나이랑 똑같은 문제(정리 글 접근법 참고)
- 칸에 적힌 방향으로만 이동이 가능하기 때문에, 각 칸끼리 이동할 수 있는 경로가 정해져 있다.
- 그러면 이동할 수 있는 경로 아무 곳에나 선물을 놓으면 된다.
- 즉, 연결요소 개수만큼만 선물을 놓는다.
코드
import java.io.*;
import java.util.*;
public class Main {
static int N, M;
static char[][] map;
static int[] parent;
static int find(int x) {
if (parent[x] == x) return x;
parent[x] = find(parent[x]);
return parent[x];
}
static void union(int a, int b) {
a = find(a);
b = find(b);
if (a == b) return;
parent[b] = a;
}
public static void main(String[] args) throws IOException {
BufferedReader br = new BufferedReader(new InputStreamReader(System.in));
BufferedWriter bw = new BufferedWriter(new OutputStreamWriter(System.out));
StringTokenizer st;
st = new StringTokenizer(br.readLine());
N = Integer.parseInt(st.nextToken());
M = Integer.parseInt(st.nextToken());
map = new char[N][M];
String input;
for (int i = 0; i < N; i++) {
input = br.readLine();
for (int j = 0; j < M; j++) {
map[i][j] = input.charAt(j);
}
}
parent = new int[N * M + 1];
for (int i = 0; i < N * M + 1; i++) {
parent[i] = i;
}
int v1, v2;
for (int i = 0; i < N; i++) {
for (int j = 0; j < M; j++) {
v1 = j + i * M + 1;
if (map[i][j] == 'N') {
v2 = j + (i - 1) * M + 1;
} else if (map[i][j] == 'W') {
v2 = j - 1 + i * M + 1;
} else if (map[i][j] == 'S') {
v2 = j + (i + 1) * M + 1;
} else {
v2 = j + 1 + i * M + 1;
}
if (find(v1) == find(v2)) continue;
union(v1, v2);
}
}
Set<Integer> set = new TreeSet<>();
for (int i = 1; i <= N * M; i++) {
set.add(find(i));
}
bw.write(String.valueOf(set.size()));
bw.flush();
bw.close();
br.close();
}
}
'📙 Algorithm Solving > Java' 카테고리의 다른 글
📙[Algo] 24.04.26 알고리즘 (0) | 2024.04.26 |
---|---|
📙[Algo] 24.04.25 알고리즘 (1) | 2024.04.25 |
📙[Algo] 24.04.23 알고리즘 (1) | 2024.04.23 |
📙[Algo] 24.04.22 알고리즘 (0) | 2024.04.22 |
📙[Algo] 24.04.21 알고리즘 (0) | 2024.04.21 |