๐ ๋ฌธ์ ๋งํฌ
https://www.acmicpc.net/problem/14466
โธ ๋ฌธ์
์๊ฐ ๊ธธ์ ๊ฑด๋๊ฐ ์ด์ ๋ ๊ทธ๋ฅ ๊ธธ์ด ๋ง์์์ด๋ค. ์กด์ ๋์ฅ์๋ ๊ธธ์ด ๋๋ฌด ๋ง์์, ๊ธธ์ ๊ฑด๋์ง ์๊ณ ์๋ ๋ณ๋ก ๋์๋ค๋ ์๊ฐ ์๋ค.
์กด์ ๋์ฅ์ ๋๋์ ์ธ ๊ฐํธ์ด ์์๋ค. ์ด์ ์์ ์ ์ฌ๊ฐํ ๋ชฉ์ด์ง๊ฐ N×N (2 ≤ N ≤ 100) ๊ฒฉ์๋ก ์ด๋ฃจ์ด์ ธ ์๋ค. ์ธ์ ํ ๋ชฉ์ด์ง ์ฌ์ด๋ ์ผ๋ฐ์ ์ผ๋ก ์์ ๋กญ๊ฒ ๊ฑด๋๊ฐ ์ ์์ง๋ง, ๊ทธ ์ค ์ผ๋ถ๋ ๊ธธ์ ๊ฑด๋์ผ ํ๋ค. ๋์ฅ์ ๋ฐ๊นฅ์๋ ๋์ ์ธํ๋ฆฌ๊ฐ ์์ด์ ์๊ฐ ๋์ฅ ๋ฐ์ผ๋ก ๋๊ฐ ์ผ์ ์๋ค.
K๋ง๋ฆฌ์ (1 ≤ K ≤ 100,K ≤ N2) ์๊ฐ ์กด์ ๋์ฅ์ ์๊ณ , ๊ฐ ์๋ ์๋ก ๋ค๋ฅธ ๋ชฉ์ด์ง์ ์๋ค. ์ด๋ค ๋ ์๋ ๊ธธ์ ๊ฑด๋์ง ์์ผ๋ฉด ๋ง๋์ง ๋ชป ํ ์ ์๋ค. ์ด๋ฐ ์๊ฐ ๋ช ์์ธ์ง ์ธ์ด๋ณด์.
โธ ์ ๋ ฅ
์ฒซ ์ค์ N, K, R์ด ์ฃผ์ด์ง๋ค. ๋ค์ R์ค์๋ ํ ์ค์ ํ๋์ฉ ๊ธธ์ด ์ฃผ์ด์ง๋ค. ๊ธธ์ ์ํ์ข์ฐ๋ก ์ธ์ ํ ๋ ๋ชฉ์ด์ง๋ฅผ ์๊ณ , r c r′ c′์ ํํ (ํ, ์ด, ํ, ์ด)๋ก ์ฃผ์ด์ง๋ค. ๊ฐ ์๋ 1 ์ด์ N ์ดํ์ด๋ค. ๊ทธ ๋ค์ K์ค์๋ ํ ์ค์ ํ๋์ฉ ์์ ์์น๊ฐ ํ๊ณผ ์ด๋ก ์ฃผ์ด์ง๋ค.
โธ ์ถ๋ ฅ
๊ธธ์ ๊ฑด๋์ง ์์ผ๋ฉด ๋ง๋ ์ ์๋ ์๊ฐ ๋ช ์์ธ์ง ์ถ๋ ฅํ๋ค.
๐ ๋ฌธ์ ์ ๋ณด
- ๐ฅ ๋ฌธ์ ๋ ๋ฒจ : ๊ณจ๋ 3
- ๐ ๋ฌธ์ ์ ํ : ๊ทธ๋ํ ์ด๋ก , ๊ทธ๋ํ ํ์, ๋๋น ์ฐ์ ํ์
- ๐ฌ ํ์ด ์ธ์ด : JAVA
๐ค ๋ฌธ์ ํ์ด
์ด ๋ฌธ์ ๋ ์์ ์์น์ ๋ค๋ฆฌ(๊ธธ)์ ์์น๊ฐ ์ฃผ์ด์ก์ ๋, ๋ค๋ฆฌ๋ฅผ ๊ฑด๋์ผ ํ๋ ์๊ฐ ๋ช ์์ธ์ง ๊ตฌํ๋ ๋ฌธ์ ์ด๋ค.
๋ฌธ์ ์ดํด๋ฅผ ์ํด ์์ ์ ๋ ฅ 1์ ์์๋ก ๋ค์ด๋ณด์
๋จผ์ ์์ ๋ค๋ฆฌ๊ฐ ์์ ๊ฐ์ด ์์นํ๋ค.
๋นจ๊ฐ์ ์์ ํ๋์ ์๋ ๋ค๋ฆฌ๋ฅผ ์ด์ฉํ์ง ์๊ณ ๋ง๋ ์ ์๋ค.
ํ์ง๋ง ๋นจ๊ฐ์ ์์ ์ด๋ก์ ์๊ฐ ๋ง๋๊ธฐ ์ํด์๋ ๋ฌด์กฐ๊ฑด ๋ค๋ฆฌ๋ฅผ ์ด์ฉํด์ผ ํ๋ค.
๋ง์ฐฌ๊ฐ์ง๋ก ํ๋์ ์์ ์ด๋ก์ ์๊ฐ ๋ง๋๊ธฐ ์ํด์๋ ๋ฌด์กฐ๊ฑด ๋ค๋ฆฌ๋ฅผ ์ด์ฉํด์ผ ํ๋ค.
์ด๋ ๊ฒ ๋๋ฉด ๋ค๋ฆฌ๋ฅผ ๊ฑด๋์ผ ํ๋ ์๋ ๋ ์์ด๋ค.
๋๋น ์ฐ์ ํ์์ ์ฌ์ฉํ์ฌ ๋ค๋ฆฌ๋ฅผ ๊ฑด๋์ง ์๊ณ ๋๋ฌํ ์ ์๋ ์์ ๊ตฌํ๋ ๋ฐฉ์์ผ๋ก ๋ฌธ์ ๋ฅผ ํด๊ฒฐํ ์ ์๋ค.
๋ค๋ฆฌ์ ๋ํ ์ ๋ณด๋ฅผ ์ ์ฅํ๊ณ ํด๋น ์ขํ๋ก ์ด๋ํ ๋, ๋ค๋ฆฌ๊ฐ ์๋ค๋ฉด ๋ ์ด์ ํ์์ ์ด์ด๊ฐ์ง ์๋๋ก ํ๋ค.
๋ํ, ์์ ๊ตฌํ๋ ๊ฒ์ด๋ฏ๋ก ์์ ๋ณด๋ค ์์ ์๋ ์๋ค์ ๊ณ์ฐํ ํ์๊ฐ ์๋ค.
์ ํ์ด๋๋ก ์ฝ๋๋ฅผ ์์ฑํด ๋ณด๋ฉด ์๋์ ๊ฐ๋ค.
โ ์ต์ข ์ฝ๋
๋ฉ๋ชจ๋ฆฌ : 32584KB
์๊ฐ : 300ms
import java.io.BufferedReader;
import java.io.IOException;
import java.io.InputStreamReader;
import java.util.ArrayList;
import java.util.LinkedList;
import java.util.Queue;
import java.util.StringTokenizer;
public class Main {
static int n, k, r;
static int[][] cow;
static boolean[][] checked;
static ArrayList<Pos>[][] road;
static int[] dx = {-1, 1, 0, 0};
static int[] dy = {0, 0, -1, 1};
static public class Pos {
int x; int y;
public Pos (int x, int y) {
this.x = x; this.y = y;
}
}
static int ans;
public static void main(String[] args) throws IOException {
BufferedReader br = new BufferedReader(new InputStreamReader(System.in));
StringTokenizer st = new StringTokenizer(br.readLine());
n = Integer.parseInt(st.nextToken()); // n*n
k = Integer.parseInt(st.nextToken()); // ์์ ์
r = Integer.parseInt(st.nextToken()); // ๋ค๋ฆฌ(๊ธธ)์ ์์น ์ ๋ณด
road = new ArrayList[n][n]; // ๋ค๋ฆฌ์ ๋ํ ์ ๋ณด ์ ์ฅ
for (int i = 0; i < n; i++) {
for (int j = 0; j < n; j++) {
road[i][j] = new ArrayList<>();
}
}
int a, b, c, d;
for (int i = 0; i < r; i++) {
st = new StringTokenizer(br.readLine());
a = Integer.parseInt(st.nextToken())-1;
b = Integer.parseInt(st.nextToken())-1;
c = Integer.parseInt(st.nextToken())-1;
d = Integer.parseInt(st.nextToken())-1;
road[a][b].add(new Pos(c, d));
road[c][d].add(new Pos(a, b));
}
cow = new int[k][2]; // ์๊ฐ ์๋ ์์น
for (int i = 0; i < k; i++) {
st = new StringTokenizer(br.readLine());
a = Integer.parseInt(st.nextToken())-1;
b = Integer.parseInt(st.nextToken())-1;
cow[i][0] = a;
cow[i][1] = b;
}
// ๊ฒฐ๊ณผ์ ์ผ๋ก ์์ ๊ตฌํ๋ ๊ฒ์ด๊ธฐ ๋๋ฌธ์ ์๊ธฐ๋ณด๋ค ๋ค์ ์๋ ์๋ค๋ง ๊ณ์ฐํ๋ฉด ๋๋ค.
for (int i = 0; i < k; i++) {
bfs(cow[i][0], cow[i][1], i);
}
// ๊ธธ์ ๊ฑด๋์ง ์์ผ๋ฉด ๋ง๋ ์ ์๋ ์๊ฐ ๋ช ์ ?
System.out.println(ans);
}
private static void bfs(int x, int y, int idx) {
Queue<Pos> que = new LinkedList<>();
que.offer(new Pos(x, y));
checked = new boolean[n][n];
checked[x][y] = true;
while (!que.isEmpty()) {
Pos now = que.poll();
for (int d = 0; d < 4; d++) {
int nx = dx[d] + now.x;
int ny = dy[d] + now.y;
if (rangeCheck(nx, ny)) continue;
boolean flag = false; // ๋ค๋ฆฌ๊ฐ ์๋์ง ์ฒดํฌ
for (int i = 0; i < road[now.x][now.y].size(); i++) {
Pos tmp = road[now.x][now.y].get(i); // ๋ค๋ฆฌ ์ ๋ณด
if (nx == tmp.x && ny == tmp.y) {
flag = true;
break;
}
}
// ๋ค๋ฆฌ๊ฐ ์๋ค๋ฉด ํ์ X
if (flag || checked[nx][ny]) continue;
checked[nx][ny] = true;
que.offer(new Pos(nx, ny));
}
}
for (int i = idx; i < k; i++) {
if (!checked[cow[i][0]][cow[i][1]]) ans++;
}
}
private static boolean rangeCheck(int x, int y) {
return x < 0 || x >= n || y < 0 || y >= n;
}
}
ํด๊ฒฐ ์๋ฃ ! ๐ฅ
'Algorithm > BOJ' ์นดํ ๊ณ ๋ฆฌ์ ๋ค๋ฅธ ๊ธ
[Boj_20183] ๊ณจ๋ชฉ ๋์ฅ ํธ์ - ํจ์จ์ฑ 2 (0) | 2025.01.18 |
---|---|
[Boj_14464] ์๊ฐ ๊ธธ์ ๊ฑด๋๊ฐ ์ด์ 4 (1) | 2025.01.16 |
[Boj_12764] ์ธ์ง๋ฐฉ์ ๊ฐ ์คํ (0) | 2025.01.08 |
[Boj_14431] ์์๋ง์ (0) | 2024.12.26 |
[Boj_11003] ์ต์๊ฐ ์ฐพ๊ธฐ (0) | 2024.12.17 |