๋ฌธ์ (์ถ์ฒ: https://www.acmicpc.net/problem/11967)
< ๋ถ์ผ๊ธฐ >
๋ฌธ์ ํ์ด
๋จผ์ (1,1) ๋ฐฉ์์ ์ค์์น๋ฅผ ํตํด ๋ค๋ฅธ ๋ฐฉ ๋ถ์ ์ผ ๋ค. ๋ถ์ด ์ผ์ง ๋ฐฉ์์ ์ํ์ข์ฐ๋ฅผ ํ์ํ์ฌ ๋ค๋ฅธ ๋ฐฉ๊ณผ ์ฐ๊ฒฐ๋์ด ์๋์ง ํ์ธํ๋ค. ๋ค๋ฅธ ๋ฐฉ๊ณผ ์ฐ๊ฒฐ๋์ด ์๋ค๋ฉด ์ด ๋ฐฉ์๋ ์ฌ ์ ์๋ค๋ ๋ป์ด ๋๋ค. ํ์ง๋ง ๋ค๋ฅธ ๋ฐฉ๊ณผ ์ฐ๊ฒฐ๋์ด ์์ง ์๋ค๋ฉด ์ด ๋ฐฉ์ ๋ถ๋ง ์ผค ์ ์๊ณ ์ด ๋ฐฉ๊ณผ ์ฐ๊ฒฐ๋ ์ค์์น๋ ์กฐ์ ํ ์ ์๋ค.
์ด๋ ๊ฒ๋ง ํ์์ ํ ๊ฒฝ์ฐ ๋ค๋ฅธ ๋ฐฉ์ ์ํด ๋ถ์ด ์ผ์ง ๋ฐฉ์ ๊ฐ ์ ์๋์ง ์๋์ง ํ์ธํ ์ ์์ผ๋ฏ๋ก ํ์ฌ ๋ฐฉ์์ ์ํ์ข์ฐ๋ฅผ ํ์ํด ๋ค๋ฅธ ๋ฐฉ์ผ๋ก ์ด๋ ๊ฐ๋ฅํ์ง ํ๋ฒ ๋ ํ๋จํ๋ค.
my solution (Java)
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 _11967_ { // ๋ถ์ผ๊ธฐ
static boolean visited[][];
static Room[][] arr;
static int dx[] = { -1, 1, 0, 0 };
static int dy[] = { 0, 0, -1, 1 };
static class Room {
private boolean light;
private ArrayList<int[]> link;
public Room(Boolean light, ArrayList<int[]> link) {
this.light = light;
this.link = link;
}
}
public static void main(String[] args) throws IOException {
BufferedReader bf = new BufferedReader(new InputStreamReader(System.in));
StringTokenizer st = new StringTokenizer(bf.readLine());
int n = Integer.parseInt(st.nextToken());
int m = Integer.parseInt(st.nextToken());
arr = new Room[n + 1][n + 1];
visited = new boolean[n + 1][n + 1];
for (int i = 1; i <= n; i++) {
for (int j = 1; j <= n; j++) {
arr[i][j] = new Room(false, new ArrayList<>());
}
}
for (int i = 0; i < m; i++) {
st = new StringTokenizer(bf.readLine());
int x = Integer.parseInt(st.nextToken());
int y = Integer.parseInt(st.nextToken());
int a = Integer.parseInt(st.nextToken());
int b = Integer.parseInt(st.nextToken());
arr[x][y].link.add(new int[] { a, b });
}
arr[1][1].light = true;
visited[1][1] = true;
System.out.println(bfs(1, 1));
}
private static int bfs(int x, int y) {
Queue<int[]> queue = new LinkedList<>();
queue.add(new int[] { x, y });
int result = 1;
while (!queue.isEmpty()) {
int pos[] = queue.poll();
for (int[] num : arr[pos[0]][pos[1]].link) {
if (!arr[num[0]][num[1]].light) {
result += 1;
arr[num[0]][num[1]].light = true;
for (int i = 0; i < 4; i++) {
int a = num[0] + dx[i];
int b = num[1] + dy[i];
if (a >= 1 && a < arr.length && b >= 1 && b < arr.length && visited[a][b]) {
visited[num[0]][num[1]] = true;
queue.add(new int[] { num[0], num[1] });
break;
}
}
}
}
for (int i = 0; i < 4; i++) {
int a = pos[0] + dx[i];
int b = pos[1] + dy[i];
if (a >= 1 && a < arr.length && b >= 1 && b < arr.length && arr[a][b].light && !visited[a][b]) {
visited[a][b] = true;
queue.add(new int[] { a, b });
}
}
}
return result;
}
}
๋ณ์)
visited : ๋ฐฉ๋ฌธ ์ฌ๋ถ
arr : ๊ฐ ์ขํ์ ํด๋นํ๋ ๋ฐฉ์ ์ ๋ณด๋ฅผ ์ ์ฅ
dx, dy : ์ํ์ข์ฐ
n, m : N x N, ๋ฐฉ ์ ๋ณด
x, y, a, b : (x, y) ๋ฐฉ์์ (a, b) ๋ฐฉ์ ๋ถ์ ์ผ๊ณ ๋ ์ ์์
Room
๋ถ ์ผ์ง ์ฌ๋ถ์ ํ์ฌ ๋ฐฉ์์ ๋ถ์ ์ผ๊ณ ๋ ์ ์๋ ๋ฐฉ ์ขํ๋ฅผ ์ ์ฅ
Main
n๊ณผ m์ ์ ๋ ฅ๋ฐ์ ํ ๋จผ์ NxN ํฌ๊ธฐ๋งํผ ๋ฐฐ์ด์ ๋ง๋ค์ด ์ด๊ธฐํํ๋ค. m ์ค ๋งํผ ๋ฐฉ ์ ๋ณด๋ฅผ ์ ๋ ฅ๋ฐ์ arr ๋ฐฐ์ด์ ์ ๋ณด๋ฅผ ์ ์ฅํ๋ค. (1,1)๋ถํฐ ์์ํ๋ฏ๋ก ๋ฐฉ ๋ถ์ ์ผ๊ณ , ๋ฐฉ๋ฌธ ํ์๋ฅผ ํ ํ bfs ํจ์๋ฅผ ํธ์ถํ ํ ๊ทธ ๊ฒฐ๊ณผ๋ฅผ ์ถ๋ ฅํ๋ค.
bfs (x์ขํ, y์ขํ)
(1,1) ์์น๋ถํฐ ์์ํ๊ธฐ ์ํด queue์ ์ถ๊ฐํ๋ฉฐ (1,1) ๋ฐฉ๋ ์ ๋ต์ ํฌํจํ๋ฏ๋ก ์ด๊ธฐ result๋ฅผ 1๋ก ์ ์ธํ๋ค.
queue๊ฐ ๋น ๋๊น์ง ๋ฐ๋ณตํ๋ค. queue์์ ๊ฐ์ ํ๋ ๋ฝ์์ ์ด ๋ฐฉ์์ ์กฐ์ ํ ์ ์๋ ๋ฐฉ๋ค์ ๋ถ์ ์ผ๊ณ , result๋ +1 ํ๋ค. ๋ฐฉ๋ค์ ๋ถ์ ์ผ๋ฉด์ ์๋ก ๋ถ์ด ์ผ์ง ๋ฐฉ๋ค์ ์์น์์ ์ํ์ข์ฐ๋ฅผ ํ์ํด ๋ค๋ฅธ ๋ฐฉ์ ์ด๋ฏธ ๋ฐฉ๋ฌธํ ์ ์ด ์๋ค๋ฉด ์๋ก ๋ถ์ด ์ผ์ง ๋ฐฉ๋ ๋ฐฉ๋ฌธํ ์ ์์ผ๋ฏ๋ก ๋ฐฉ๋ฌธ ํ์ ํ queue์ ์ถ๊ฐํ๋ค.
ํ์ฌ ์์น์์ ์ํ์ข์ฐ๋ฅผ ํ์ํด ๋ถ์ด ์ผ์ง ๋ฐฉ์ด์ง๋ง ์์ง ๋ฐฉ๋ฌธํ์ง ์์ ๊ณณ์ ์ฐพ์ ๋ฐฉ๋ฌธํ๋ค.
์ต์ข reuslt๋ฅผ ๋ฐํํ๋ค.
'๐Algorithm > ๐ฅBaekjoon' ์นดํ ๊ณ ๋ฆฌ์ ๋ค๋ฅธ ๊ธ
[Baekjoon] 19238_์คํํธ ํ์ (1) | 2024.02.05 |
---|---|
[Baekjoon] 1167_ํธ๋ฆฌ์ ์ง๋ฆ (1) | 2024.02.02 |
[Baekjoon] 8892_ํฐ๋ฆฐ๋๋กฌ (1) | 2024.01.31 |
[Baekjoon] 19637_IF๋ฌธ ์ข ๋์ ์จ์ค (1) | 2024.01.30 |
[Baekjoon] 10431_์ค์ธ์ฐ๊ธฐ (1) | 2024.01.29 |