์ผ | ์ | ํ | ์ | ๋ชฉ | ๊ธ | ํ |
---|---|---|---|---|---|---|
1 | 2 | 3 | ||||
4 | 5 | 6 | 7 | 8 | 9 | 10 |
11 | 12 | 13 | 14 | 15 | 16 | 17 |
18 | 19 | 20 | 21 | 22 | 23 | 24 |
25 | 26 | 27 | 28 | 29 | 30 | 31 |
- ํฌํฌ์ธํฐ
- ์ธ๊ทธ๋จผํธํธ๋ฆฌ
- ํ์๊ฐ์
- ํ๋ก์ด๋์์
- upperbound
- ๋ค์ต์คํธ๋ผ
- ๋ถ๋ถ์งํฉ
- ์ฐ์ ์์ํ
- dfs
- Union Find
- ๊ทธ๋ฆฌ๋
- ๋นํธ๋ง์คํน
- PriorityQueue
- ์๋ฃ๊ตฌ์กฐ
- ์ด๋ถํ์
- dp
- ๊ตฌํ
- ์ฌ๊ท
- Django
- ์ด์งํธ๋ฆฌ
- BFS
- LowerBound
- ์นด์นด์ค
- ์กฐํฉ
- Floyd
- ์๋ฎฌ๋ ์ด์
- ๋ฐฑํธ๋ํน
- ์์ด
- ํธ๋ผ์ด
- Dijkstra
- Today
- Total
J
[JAVA] BOJ ๋ฐฑ์ค 15683 ๊ฐ์ ๋ณธ๋ฌธ
[JAVA] BOJ ๋ฐฑ์ค 15683 ๊ฐ์
snowball๐ฐ 2023. 1. 29. 00:46https://www.acmicpc.net/problem/15683
15683๋ฒ: ๊ฐ์
์คํํธ๋งํฌ์ ์ฌ๋ฌด์ค์ 1×1ํฌ๊ธฐ์ ์ ์ฌ๊ฐํ์ผ๋ก ๋๋์ด์ ธ ์๋ N×M ํฌ๊ธฐ์ ์ง์ฌ๊ฐํ์ผ๋ก ๋ํ๋ผ ์ ์๋ค. ์ฌ๋ฌด์ค์๋ ์ด K๊ฐ์ CCTV๊ฐ ์ค์น๋์ด์ ธ ์๋๋ฐ, CCTV๋ 5๊ฐ์ง ์ข ๋ฅ๊ฐ ์๋ค. ๊ฐ CCTV๊ฐ ๊ฐ
www.acmicpc.net
๋ฌธ์
์คํํธ๋งํฌ์ ์ฌ๋ฌด์ค์ 1×1ํฌ๊ธฐ์ ์ ์ฌ๊ฐํ์ผ๋ก ๋๋์ด์ ธ ์๋ N×M ํฌ๊ธฐ์ ์ง์ฌ๊ฐํ์ผ๋ก ๋ํ๋ผ ์ ์๋ค. ์ฌ๋ฌด์ค์๋ ์ด K๊ฐ์ CCTV๊ฐ ์ค์น๋์ด์ ธ ์๋๋ฐ, CCTV๋ 5๊ฐ์ง ์ข ๋ฅ๊ฐ ์๋ค. ๊ฐ CCTV๊ฐ ๊ฐ์ํ ์ ์๋ ๋ฐฉ๋ฒ์ ๋ค์๊ณผ ๊ฐ๋ค.
1๋ฒ CCTV๋ ํ ์ชฝ ๋ฐฉํฅ๋ง ๊ฐ์ํ ์ ์๋ค. 2๋ฒ๊ณผ 3๋ฒ์ ๋ ๋ฐฉํฅ์ ๊ฐ์ํ ์ ์๋๋ฐ, 2๋ฒ์ ๊ฐ์ํ๋ ๋ฐฉํฅ์ด ์๋ก ๋ฐ๋๋ฐฉํฅ์ด์ด์ผ ํ๊ณ , 3๋ฒ์ ์ง๊ฐ ๋ฐฉํฅ์ด์ด์ผ ํ๋ค. 4๋ฒ์ ์ธ ๋ฐฉํฅ, 5๋ฒ์ ๋ค ๋ฐฉํฅ์ ๊ฐ์ํ ์ ์๋ค.
CCTV๋ ๊ฐ์ํ ์ ์๋ ๋ฐฉํฅ์ ์๋ ์นธ ์ ์ฒด๋ฅผ ๊ฐ์ํ ์ ์๋ค. ์ฌ๋ฌด์ค์๋ ๋ฒฝ์ด ์๋๋ฐ, CCTV๋ ๋ฒฝ์ ํต๊ณผํ ์ ์๋ค. CCTV๊ฐ ๊ฐ์ํ ์ ์๋ ์์ญ์ ์ฌ๊ฐ์ง๋๋ผ๊ณ ํ๋ค.
CCTV๋ ํ์ ์ํฌ ์ ์๋๋ฐ, ํ์ ์ ํญ์ 90๋ ๋ฐฉํฅ์ผ๋ก ํด์ผ ํ๋ฉฐ, ๊ฐ์ํ๋ ค๊ณ ํ๋ ๋ฐฉํฅ์ด ๊ฐ๋ก ๋๋ ์ธ๋ก ๋ฐฉํฅ์ด์ด์ผ ํ๋ค.
CCTV๋ CCTV๋ฅผ ํต๊ณผํ ์ ์๋ค. ์๋ ์์๋ฅผ ๋ณด์.
0 0 2 0 3
0 6 0 0 0
0 0 6 6 0
0 0 0 0 0
์์ ๊ฐ์ ๊ฒฝ์ฐ์ 2์ ๋ฐฉํฅ์ด โ 3์ ๋ฐฉํฅ์ด ←์ ↓์ธ ๊ฒฝ์ฐ ๊ฐ์๋ฐ๋ ์์ญ์ ๋ค์๊ณผ ๊ฐ๋ค.
# # 2 # 3
0 6 # 0 #
0 0 6 6 #
0 0 0 0 #
์ฌ๋ฌด์ค์ ํฌ๊ธฐ์ ์ํ, ๊ทธ๋ฆฌ๊ณ CCTV์ ์ ๋ณด๊ฐ ์ฃผ์ด์ก์ ๋, CCTV์ ๋ฐฉํฅ์ ์ ์ ํ ์ ํด์, ์ฌ๊ฐ ์ง๋์ ์ต์ ํฌ๊ธฐ๋ฅผ ๊ตฌํ๋ ํ๋ก๊ทธ๋จ์ ์์ฑํ์์ค.
์ ๋ ฅ
์ฒซ์งธ ์ค์ ์ฌ๋ฌด์ค์ ์ธ๋ก ํฌ๊ธฐ N๊ณผ ๊ฐ๋ก ํฌ๊ธฐ M์ด ์ฃผ์ด์ง๋ค. (1 ≤ N, M ≤ 8)
๋์งธ ์ค๋ถํฐ N๊ฐ์ ์ค์๋ ์ฌ๋ฌด์ค ๊ฐ ์นธ์ ์ ๋ณด๊ฐ ์ฃผ์ด์ง๋ค. 0์ ๋น ์นธ, 6์ ๋ฒฝ, 1~5๋ CCTV๋ฅผ ๋ํ๋ด๊ณ , ๋ฌธ์ ์์ ์ค๋ช ํ CCTV์ ์ข ๋ฅ์ด๋ค.
CCTV์ ์ต๋ ๊ฐ์๋ 8๊ฐ๋ฅผ ๋์ง ์๋๋ค.
์ถ๋ ฅ
์ฒซ์งธ ์ค์ ์ฌ๊ฐ ์ง๋์ ์ต์ ํฌ๊ธฐ๋ฅผ ์ถ๋ ฅํ๋ค.
์ฝ๋
์ ์ฒด ์ฝ๋
import java.io.*;
import java.util.*;
public class BOJ_15683 {
static int N;
static int M;
static int max;
static int num;
static int[][] office;
static int[][] cctv;
static int[][] dir;
static int result;
public static void main(String[] args) throws Exception {
BufferedReader bf = new BufferedReader(new InputStreamReader(System.in));
StringBuilder sb = new StringBuilder();
StringTokenizer st = new StringTokenizer(bf.readLine(), " ");
N = Integer.parseInt(st.nextToken());
M = Integer.parseInt(st.nextToken());
if (N > M)
max = N;
else
max = M;
office = new int[N][M];
for (int i = 0; i < N; i++) {
st = new StringTokenizer(bf.readLine(), " ");
for (int j = 0; j < M; j++) {
office[i][j] = Integer.parseInt(st.nextToken());
if (office[i][j] != 0 && office[i][j] != 6)
num++;
}
}
cctv = new int[num][3];
dir = new int[][] { { 0, 0, 0, 1 }, { 0, 1, 0, 1 }, { 1, 0, 0, 1 }, { 1, 1, 0, 1 }, { 1, 1, 1, 1 } };
int k = 0;
for (int i = 0; i < N; i++)
for (int j = 0; j < M; j++)
if (office[i][j] != 0 && office[i][j] != 6) {
cctv[k][0] = i;
cctv[k][1] = j;
k++;
}
result = N * M;
dfs(0);
sb.append(result).append("\\n");
System.out.println(sb.toString());
}
static void dfs(int count) {
if (count == num) {
count();
return;
}
if (office[cctv[count][0]][cctv[count][1]] == 2)
for (int i = 0; i < 2; i++) {
cctv[count][2] = i;
dfs(count + 1);
}
else if (office[cctv[count][0]][cctv[count][1]] == 5) {
cctv[count][2] = 1;
dfs(count + 1);
} else {
for (int i = 0; i < 4; i++) {
cctv[count][2] = i;
dfs(count + 1);
}
}
}
static void count() {
int[] dx = { -1, 0, 1, 0 };
int[] dy = { 0, -1, 0, 1 };
int status = 0;
int count = 0;
int[][] check = new int[N][M];
for (int u = 0; u < N; u++)
System.arraycopy(office[u], 0, check[u], 0, M);
int nx, ny;
for (int i = 0; i < num; i++) {
status = office[cctv[i][0]][cctv[i][1]];
for (int d = 0; d < 4; d++) {
if (dir[status - 1][d] == 0)
continue;
end: for (int k = 1; k < max; k++) {
nx = cctv[i][0] + k * dx[(d + cctv[i][2]) % 4];
ny = cctv[i][1] + k * dy[(d + cctv[i][2]) % 4];
if (nx < 0 || ny < 0 || nx >= N || ny >= M || office[nx][ny] == 6)
break end;
else
check[nx][ny] = 9;
}
}
}
for (int i = 0; i < N; i++)
for (int j = 0; j < M; j++)
if (check[i][j] == 0)
count++;
if (count < result)
result = count;
}
}
ํ์ค์ฉ ์ดํด๋ณด์!
static int N;
static int M;
static int max;
static int num;
static int[][] office;
static int[][] cctv;
static int[][] dir;
static int result;
์ ์ญ ๋ณ์๋ก ์ฌ์ฉํ ๋ณ์๋ ๋ค์๊ณผ ๊ฐ๋ค.
max๋ N, M ์ค ๋ ํฐ ๊ฐ์ ๋ด๊ณ ์๋ค. cctv๋ ๋ฒฝ์ด ๋ฟ๊ฑฐ๋ ์นธ์ ๋ฒ์ด๋ ๋๊น์ง ์กฐ์ฌํ ์ ์๊ธฐ ๋๋ฌธ์ ์กฐ์ฌํ ์ ์๋ ์ต๋ ๊ธธ์ด๋ max-1์ด ๋๋ค.
num์ cctv์ ๊ฐ์ ์ ๋ณด๋ฅผ ๋ด๊ณ ์๋ค.
office ๋ฐฐ์ด์ ์ฌ๋ฌด์ค์ ์ ๋ณด๋ฅผ ๋ด๊ณ ์๋ค.
cctv ๋ฐฐ์ด์ ๊ฐ cctv์ ์์น, ๋ฐฉํฅ์ ๋ด๊ณ ์๋ค.
dir ๋ฐฐ์ด์ 1~5 ๋ฒ cctv๊ฐ ์กฐ์ฌํ ์ ์๋ ๋ฐฉํฅ์ ์ ๋ณด๋ฅผ 0, 1๋ก ํํํ๋ค. ๋ฐ์์ ๋ค์ ์ค๋ช ํ๊ฒ ๋ค.
for (int i = 0; i < N; i++) {
st = new StringTokenizer(bf.readLine(), " ");
for (int j = 0; j < M; j++) {
office[i][j] = Integer.parseInt(st.nextToken());
if (office[i][j] != 0 && office[i][j] != 6)
num++;
}
}
office ์ ๋ณด๋ฅผ ์ ๋ ฅ ๋ฐ์๊ณผ ๋์์ cctv์ ๊ฐ์๋ฅผ num ๋ณ์์ ๋ด์์ค๋ค.
cctv = new int[num][3];
dir = new int[][] { { 0, 0, 0, 1 }, { 0, 1, 0, 1 }, { 1, 0, 0, 1 }, { 1, 1, 0, 1 }, { 1, 1, 1, 1 } };
int k = 0;
for (int i = 0; i < N; i++)
for (int j = 0; j < M; j++)
if (office[i][j] != 0 && office[i][j] != 6) {
cctv[k][0] = i;
cctv[k][1] = j;
k++;
}
result = N * M;
dir ๋ฐฐ์ด์ ๋ณด์์ ๋ dir[0]์๋ cctv 1๋ฒ์ด ์กฐ์ฌํ ์ ์๋ ๋ฐฉํฅ์ ๋ํ ์กฐ์ฌ๊ฐ ๋์์๋ค. cctv๋ ํ์ชฝ ๋ฐฉํฅ ๋ฐ์ ๋ณด์ง ๋ชปํ๋ฏ๋ก 3๋ฒ ์ธ๋ฑ์ค์๋ง 1์ ๊ฐ์ ์ฃผ์๋ค.
๋๋ ๋ถ, ์, ๋จ, ๋ ์์ผ๋ก ๊ทธ๋ฆผ์ ์ฐธ๊ณ ํ์ฌ 0, 1๋ก ํํํ์๋ค. ๋ฐฑ์ค ๊ทธ๋ฆผ์ ๋ฐ๋ฅด๋ฉด 1๋ฒ cctv๋ ๋์ชฝ๋ง์ ๋ฐ๋ผ๋ณด๊ณ ์์ผ๋ฏ๋ก 3๋ฒ์ 1๋ก ์ค์ ํ์๋ค.
for๋ฌธ์ ํตํด cctv์ ํ๋ ฌ ์ ๋ณด๋ฅผ ๋ฐฐ์ด์ ๋ด์์ค๋ค. ์ด๋ cctv์ ์์น ๊ฐ์ด ์์ผ๋ฏ๋ก ๋ช๋ฒ cctv์ธ์ง์ ๋ํ ์ ๋ณด๋ฅผ ๋ฐ๋ก ๋ด์๋์ง๋ ์์๋ค.
result๋ ๊ฒฐ๊ณผ๊ฐ์ ๋ด์ ๋ณ์๋ก ์ต์๊ฐ์ ๊ตฌํ๊ธฐ ๋๋ฌธ์ ๋ฌธ์ ์์ ๋์ฌ์ ์๋ ๊ฐ๋ฅํ ์ต๋๊ฐ์ธ N*M์ผ๋ก ์ด๊ธฐํ ํ์๋ค.
static void dfs(int count) {
if (count == num) {
count();
return;
}
dfs ํจ์๋ฅผ ํตํด ๋ชจ๋ cctv์ ๋ฐฉํฅ ์ค์ ์ ํด์ค ๊ฒ์ด๋ค.
count๋ ์ฌํ ์ค์ ๋ cctv์ ๊ฐ์๋ฅผ ๋ปํ๋ค. num๊ณผ ๊ฐ์์ง๋ฉด ๋ชจ๋ cctv์ ์ค์ ์ด ๋๋ฌ๊ธฐ ๋๋ฌธ์ countํจ์๋ฅผ ํตํด ์ฌ๊ฐ์ง๋๋ฅผ ๊ณ์ฐํ๊ณ returnํ์ฌ ํจ์๋ฅผ ์ข ๋ฃํ๋ค.
if (office[cctv[count][0]][cctv[count][1]] == 2)
for (int i = 0; i < 2; i++) {
cctv[count][2] = i;
dfs(count + 1);
}
else if (office[cctv[count][0]][cctv[count][1]] == 5) {
cctv[count][2] = 1;
dfs(count + 1);
} else {
for (int i = 0; i < 4; i++) {
cctv[count][2] = i;
dfs(count + 1);
}
}
2๋ฒ cctv์ 5๋ฒ cctv๋ ๋ค๋ฅธ ๊ฒ๊ณผ๋ ๋ฌ๋ฆฌ 4๋ฐฉํฅ ํ์ ์ค ๊ฐ์์ง๋ ๊ฒ์ด ์กด์ฌํ์ฌ ํจ์์ ์๋๋ฅผ ์ฆ๊ฐ์ํค๊ธฐ ์ํ์ฌ ๋ถ๋ฆฌํ์๋ค.
count๋ฒ์งธ cctv์ ๋ฐฉํฅ์ ์ค์ ํด์ฃผ๊ณ dfsํจ์๋ฅผ ์คํํ๋ค.
static void count() {
int[] dx = { -1, 0, 1, 0 };
int[] dy = { 0, -1, 0, 1 };
int status = 0;
int count = 0;
int[][] check = new int[N][M];
for (int u = 0; u < N; u++)
System.arraycopy(office[u], 0, check[u], 0, M);
dx, dy๋ ๋ถ, ์, ๋จ, ๋ ์์ผ๋ก ๋ฐฉํฅ์ ์ค์ ํด์ฃผ๋ ๋ฐฐ์ด์ด๋ค.
status๋ ์กฐ์ฌํ cctv์ ๋ฒํธ๋ฅผ ์ ์ฅํ๋ ๋ณ์์ด๋ค.
count๋ณ์๋ฅผ ํตํด ์ฌ๊ฐ์ง๋๋ฅผ ์ ์ฅํ๋ค.
check ๋ฐฐ์ด์ ํตํด office ๋ฐฐ์ด์ ๊น์ ๋ณต์ฌ ํด์ค๋ค. office ๋ฐฐ์ด์ ๋ชจ๋ ์ํฉ์ ์กฐ์ฌํ ๋ ์ฐ์ด๊ธฐ ๋๋ฌธ์ ์์ ์ ํ๋ฉด ์๋ ์ํ๋ก ๋ฐ๊พธ์ด์ฃผ์ด์ผ ํ๋ค. ๊ทธ๋ฌ๋ฏ๋ก check๋ผ๋ ์๋ก์ด ๋ฐฐ์ด์ ํตํด ์์ ์ ํ ๊ฒ์ด๋ค.
int nx, ny;
for (int i = 0; i < num; i++) {
status = office[cctv[i][0]][cctv[i][1]];
nx, ny๋ฅผ ํตํด cctv๊ฐ ๊ฐ์ํ ๊ตฌ์ญ์ ์์น ์ ๋ณด๋ฅผ ์ ์ฅํ ๊ฒ์ด๋ค.
์ฒซ๋ฒ์งธ for loop๋ cctv์ ๊ฐ์์ด๋ค. ์ ์ฅ๋ cctv ์ ๋ณด๋ฅผ ํ ๋๋ก ๋ชจ๋ cctv์ ๊ฐ์๊ตฌ์ญ์ ํ์ธํ๋ค.
status์ cctv์ ๋ฒํธ๋ฅผ ์ ์ฅํด์ค๋ค.
for (int d = 0; d < 4; d++) {
if (dir[status - 1][d] == 0)
continue;
๋๋ฒ์งธ for loop๋ฅผ ํตํด ๋ถ, ์, ๋จ, ๋์ ๋ค ๋ฐฉํฅ์ ์กฐ์ฌํ ๊ฒ์ด๋ค. ์ด๋ dir๋ฐฐ์ด์ ํตํด cctv์ ํด๋น ๋ฒํธ๊ฐ ์กฐ์ฌํ ๋ฐฉํฅ์ด ์๋ ๊ฒฝ์ฐ continue๋ฅผ ์ํํ๋ค.
end: for (int k = 1; k < max; k++) {
nx = cctv[i][0] + k * dx[(d + cctv[i][2]) % 4];
ny = cctv[i][1] + k * dy[(d + cctv[i][2]) % 4];
if (nx < 0 || ny < 0 || nx >= N || ny >= M || office[nx][ny] == 6)
break end;
else
check[nx][ny] = 9;
}
ํด๋น ๋ฐฉํฅ ์ชฝ์ ๋ชจ๋ ๊ตฌ์ญ์ ์กฐ์ฌํด์ผ ํ๊ธฐ ๋๋ฌธ์ k๋ฅผ max๊น์ง๋ก ์ค์ ํด์ค๋ค.
์ด๋ ์๋๋ k * dx[d]๋ก ํํํด์ผ ํ์ง๋ง cctv์ ํ์ ์ ๊ณ ๋ คํ์ฌ ํ์ ์ ๋ณด๊ฐ ๋ด๊ธด cctv[i][2]๋ฅผ ๋ ํด์ค๋ค. index๊ฐ 3์ ๋์ง ์์์ผ ํ๋ฏ๋ก ํฉ์ 4๋ก ๋๋ ๋ชซ์ ์ธ๋ฑ์ค ์ ๋ณด์ ๋ฃ์ด์ค๋ค.
๋ง์ฝ ๊ฒฉ์๋ฅผ ๋ฒ์ด๋๊ฑฐ๋ ๋ฒฝ์ธ ๊ฒฝ์ฐ ๊ทธ ๋ฐฉํฅ์ ๋ ์ด์ ์กฐ์ฌํ์ง ์๋๋ค.
์๋ ๊ฒฝ์ฐ cctv์ ๊ฐ์ ๊ตฌ์ญ์ด๋ฏ๋ก 9๋ก ํ์ํ๋ค.
for (int i = 0; i < N; i++)
for (int j = 0; j < M; j++)
if (check[i][j] == 0)
count++;
if (count < result)
result = count;
์ด์ค loop๋ฅผ ํตํด 0์ธ ๊ตฌ์ญ(์ฌ๊ฐ์ง๋)์ ๊ฐ์๋ฅผ ์กฐ์ฌํ๋ค. ๊ฐ๋ฅํ count ์ค ์ต์๊ฐ์ ์ฐพ์ result์ ๋ฃ์ด์ค๋ค.
'๐ Problem Solving > ๐ป Samsung SW Expert' ์นดํ ๊ณ ๋ฆฌ์ ๋ค๋ฅธ ๊ธ
[JAVA] BOJ ๋ฐฑ์ค 15684 ์ฌ๋ค๋ฆฌ ์กฐ์ (0) | 2023.02.03 |
---|---|
[JAVA] BOJ ๋ฐฑ์ค 15686 ์นํจ ๊ฑฐ๋ฆฌ (0) | 2023.01.29 |
[JAVA] BOJ ๋ฐฑ์ค 14891 ํฑ๋๋ฐํด (1) | 2023.01.29 |
[JAVA] BOJ ๋ฐฑ์ค 14889 ์คํํธ์ ๋งํฌ (0) | 2023.01.29 |
[JAVA] BOJ ๋ฐฑ์ค 14503 ๋ก๋ด ์ฒญ์๊ธฐ (0) | 2023.01.28 |