์ผ | ์ | ํ | ์ | ๋ชฉ | ๊ธ | ํ |
---|---|---|---|---|---|---|
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 |
- ๊ตฌํ
- ๋นํธ๋ง์คํน
- ๋ฐฑํธ๋ํน
- Floyd
- dp
- ํ์๊ฐ์
- ์์ด
- ์๋ฎฌ๋ ์ด์
- ์ฐ์ ์์ํ
- ์ด์งํธ๋ฆฌ
- Dijkstra
- BFS
- PriorityQueue
- ์ด๋ถํ์
- ์นด์นด์ค
- upperbound
- LowerBound
- dfs
- ํฌํฌ์ธํฐ
- ์ธ๊ทธ๋จผํธํธ๋ฆฌ
- ์ฌ๊ท
- ํธ๋ผ์ด
- ๋ถ๋ถ์งํฉ
- Django
- ํ๋ก์ด๋์์
- ์กฐํฉ
- ๊ทธ๋ฆฌ๋
- ๋ค์ต์คํธ๋ผ
- ์๋ฃ๊ตฌ์กฐ
- Union Find
- Today
- Total
J
[JAVA] BOJ ๋ฐฑ์ค 15686 ์นํจ ๊ฑฐ๋ฆฌ ๋ณธ๋ฌธ
[JAVA] BOJ ๋ฐฑ์ค 15686 ์นํจ ๊ฑฐ๋ฆฌ
snowball๐ฐ 2023. 1. 29. 21:55https://www.acmicpc.net/problem/15686
๋ฌธ์
ํฌ๊ธฐ๊ฐ N×N์ธ ๋์๊ฐ ์๋ค. ๋์๋ 1×1ํฌ๊ธฐ์ ์นธ์ผ๋ก ๋๋์ด์ ธ ์๋ค. ๋์์ ๊ฐ ์นธ์ ๋น ์นธ, ์นํจ์ง, ์ง ์ค ํ๋์ด๋ค. ๋์์ ์นธ์ (r, c)์ ๊ฐ์ ํํ๋ก ๋ํ๋ด๊ณ , rํ c์ด ๋๋ ์์์๋ถํฐ r๋ฒ์งธ ์นธ, ์ผ์ชฝ์์๋ถํฐ c๋ฒ์งธ ์นธ์ ์๋ฏธํ๋ค. r๊ณผ c๋ 1๋ถํฐ ์์ํ๋ค.
→ ์ธ๋ฑ์ค๋ฅผ 0์ด ์๋ 1๋ถํฐ ์์ํ๋ผ๋ ๋ง. 0๋ถํฐ ์์ํด๋ ๋ฌธ์ ๋ฅผ ํธ๋๋ฐ์๋ ์ ํ ์ง์ฅ์ด ์๋ค.
์ด ๋์์ ์ฌ๋ ์ฌ๋๋ค์ ์นํจ์ ๋งค์ฐ ์ข์ํ๋ค. ๋ฐ๋ผ์, ์ฌ๋๋ค์ "์นํจ ๊ฑฐ๋ฆฌ"๋ผ๋ ๋ง์ ์ฃผ๋ก ์ฌ์ฉํ๋ค. ์นํจ ๊ฑฐ๋ฆฌ๋ ์ง๊ณผ ๊ฐ์ฅ ๊ฐ๊น์ด ์นํจ์ง ์ฌ์ด์ ๊ฑฐ๋ฆฌ์ด๋ค. ์ฆ, ์นํจ ๊ฑฐ๋ฆฌ๋ ์ง์ ๊ธฐ์ค์ผ๋ก ์ ํด์ง๋ฉฐ, ๊ฐ๊ฐ์ ์ง์ ์นํจ ๊ฑฐ๋ฆฌ๋ฅผ ๊ฐ์ง๊ณ ์๋ค. ๋์์ ์นํจ ๊ฑฐ๋ฆฌ๋ ๋ชจ๋ ์ง์ ์นํจ ๊ฑฐ๋ฆฌ์ ํฉ์ด๋ค.
์์์ ๋ ์นธ (r1, c1)๊ณผ (r2, c2) ์ฌ์ด์ ๊ฑฐ๋ฆฌ๋ |r1-r2| + |c1-c2|๋ก ๊ตฌํ๋ค.
์๋ฅผ ๋ค์ด, ์๋์ ๊ฐ์ ์ง๋๋ฅผ ๊ฐ๋ ๋์๋ฅผ ์ดํด๋ณด์.
0 2 0 1 0
1 0 1 0 0
0 0 0 0 0
0 0 0 1 1
0 0 0 1 2
0์ ๋น ์นธ, 1์ ์ง, 2๋ ์นํจ์ง์ด๋ค.
(2, 1)์ ์๋ ์ง๊ณผ (1, 2)์ ์๋ ์นํจ์ง๊ณผ์ ๊ฑฐ๋ฆฌ๋ |2-1| + |1-2| = 2, (5, 5)์ ์๋ ์นํจ์ง๊ณผ์ ๊ฑฐ๋ฆฌ๋ |2-5| + |1-5| = 7์ด๋ค. ๋ฐ๋ผ์, (2, 1)์ ์๋ ์ง์ ์นํจ ๊ฑฐ๋ฆฌ๋ 2์ด๋ค.
(5, 4)์ ์๋ ์ง๊ณผ (1, 2)์ ์๋ ์นํจ์ง๊ณผ์ ๊ฑฐ๋ฆฌ๋ |5-1| + |4-2| = 6, (5, 5)์ ์๋ ์นํจ์ง๊ณผ์ ๊ฑฐ๋ฆฌ๋ |5-5| + |4-5| = 1์ด๋ค. ๋ฐ๋ผ์, (5, 4)์ ์๋ ์ง์ ์นํจ ๊ฑฐ๋ฆฌ๋ 1์ด๋ค.
์ด ๋์์ ์๋ ์นํจ์ง์ ๋ชจ๋ ๊ฐ์ ํ๋์ฐจ์ด์ฆ์ด๋ค. ํ๋ ์ฐจ์ด์ฆ ๋ณธ์ฌ์์๋ ์์ต์ ์ฆ๊ฐ์ํค๊ธฐ ์ํด ์ผ๋ถ ์นํจ์ง์ ํ์ ์ํค๋ ค๊ณ ํ๋ค. ์ค๋ ์ฐ๊ตฌ ๋์ ์ด ๋์์์ ๊ฐ์ฅ ์์ต์ ๋ง์ด ๋ผ ์ ์๋ ์นํจ์ง์ ๊ฐ์๋ ์ต๋ M๊ฐ๋ผ๋ ์ฌ์ค์ ์์๋ด์๋ค.
๋์์ ์๋ ์นํจ์ง ์ค์์ ์ต๋ M๊ฐ๋ฅผ ๊ณ ๋ฅด๊ณ , ๋๋จธ์ง ์นํจ์ง์ ๋ชจ๋ ํ์ ์์ผ์ผ ํ๋ค. ์ด๋ป๊ฒ ๊ณ ๋ฅด๋ฉด, ๋์์ ์นํจ ๊ฑฐ๋ฆฌ๊ฐ ๊ฐ์ฅ ์๊ฒ ๋ ์ง ๊ตฌํ๋ ํ๋ก๊ทธ๋จ์ ์์ฑํ์์ค.
์ ๋ ฅ
์ฒซ์งธ ์ค์ N(2 ≤ N ≤ 50)๊ณผ M(1 ≤ M ≤ 13)์ด ์ฃผ์ด์ง๋ค.
๋์งธ ์ค๋ถํฐ N๊ฐ์ ์ค์๋ ๋์์ ์ ๋ณด๊ฐ ์ฃผ์ด์ง๋ค.
๋์์ ์ ๋ณด๋ 0, 1, 2๋ก ์ด๋ฃจ์ด์ ธ ์๊ณ , 0์ ๋น ์นธ, 1์ ์ง, 2๋ ์นํจ์ง์ ์๋ฏธํ๋ค. ์ง์ ๊ฐ์๋ 2N๊ฐ๋ฅผ ๋์ง ์์ผ๋ฉฐ, ์ ์ด๋ 1๊ฐ๋ ์กด์ฌํ๋ค. ์นํจ์ง์ ๊ฐ์๋ M๋ณด๋ค ํฌ๊ฑฐ๋ ๊ฐ๊ณ , 13๋ณด๋ค ์๊ฑฐ๋ ๊ฐ๋ค.
์ถ๋ ฅ
์ฒซ์งธ ์ค์ ํ์ ์ํค์ง ์์ ์นํจ์ง์ ์ต๋ M๊ฐ๋ฅผ ๊ณจ๋์ ๋, ๋์์ ์นํจ ๊ฑฐ๋ฆฌ์ ์ต์๊ฐ์ ์ถ๋ ฅํ๋ค.
์ฝ๋
์ ์ฒด ์ฝ๋
import java.io.*;
import java.util.*;
public class BOJ_15686 {
static int N;
static int M;
static int chicken;
static int[][] chickens;
static int[][] city;
static int home;
static int[][] homes;
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());
city = new int[N][N];
for (int i = 0; i < N; i++) {
st = new StringTokenizer(bf.readLine(), " ");
for (int j = 0; j < N; j++) {
city[i][j] = Integer.parseInt(st.nextToken());
if (city[i][j] == 2)
chicken++;
if (city[i][j] == 1)
home++;
}
}
chickens = new int[chicken][3];
homes = new int[home][2];
int h = 0;
int c = 0;
for (int i = 0; i < N; i++)
for (int j = 0; j < N; j++) {
if (city[i][j] == 2) {
chickens[c][0] = i;
chickens[c++][1] = j;
}
if (city[i][j] == 1) {
homes[h][0] = i;
homes[h++][1] = j;
}
}
result = Integer.MAX_VALUE;
dfs(0, 0);
sb.append(result).append("\\n");
System.out.println(sb.toString());
}
static void dfs(int market, int x) {
if (market == M) {
account();
return;
}
for (int i = x; i < chicken; i++) {
if (chickens[i][2] == 1)
continue;
chickens[i][2] = 1;
dfs(market + 1, i);
chickens[i][2] = 0;
}
}
static void account() {
int loads = 0;
for (int i = 0; i < home; i++) {
int load = Integer.MAX_VALUE;
for (int j = 0; j < chicken; j++) {
if (chickens[j][2] == 0)
continue;
if (load > Math.abs(homes[i][0] - chickens[j][0]) + Math.abs(homes[i][1] - chickens[j][1]))
load = Math.abs(homes[i][0] - chickens[j][0]) + Math.abs(homes[i][1] - chickens[j][1]);
}
loads += load;
}
if (loads < result)
result = loads;
}
}
ํ์ค์ฉ ์ดํด ๋ณด์!
static int N;
static int M;
static int chicken;
static int[][] chickens;
static int[][] city;
static int home;
static int[][] homes;
static int result;
ํด๋์ค ๋ณ์๋ค์ ๋ค์๊ณผ ๊ฐ๋ค.
์ฌ๊ธฐ์ chicken์ ์นํจ์ง์ ๊ฐ์๋ฅผ chickens ๋ฐฐ์ด์ ์นํจ์ง์ ์์น์ ์ํ๋ฅผ ์ ์ฅํ๊ณ ์๋ค.
home๋ ์ง์ ๊ฐ์์ ์ง์ ์์น๋ฅผ ์ ์ฅํ๊ณ ์๋ค.
city๋ฐฐ์ด์ ์ ๋ ฅ๋ฐ์ ๋ง์ ์ ๋ณด๋ฅผ ์ ์ฅํ๊ณ ์๋ค.
for (int i = 0; i < N; i++) {
st = new StringTokenizer(bf.readLine(), " ");
for (int j = 0; j < N; j++) {
city[i][j] = Integer.parseInt(st.nextToken());
if (city[i][j] == 2)
chicken++;
if (city[i][j] == 1)
home++;
}
}
for๋ฌธ์ ํตํด ์ ๋ ฅ ๋ฐ์ผ๋ฉด์ 2์ธ ๊ฒฝ์ฐ(์นํจ์ง์ธ ๊ฒฝ์ฐ) chicken ๋ณ์๋ฅผ ์ฆ๊ธฐ์ํค๊ณ ์ง์ธ ๊ฒฝ์ฐ home์ ์ฆ๊ฐ์์ผ ๊ฐ์๋ฅผ ์ผ๋ค.
chickens = new int[chicken][3];
homes = new int[home][2];
int h = 0;
int c = 0;
for (int i = 0; i < N; i++)
for (int j = 0; j < N; j++) {
if (city[i][j] == 2) {
chickens[c][0] = i;
chickens[c++][1] = j;
}
if (city[i][j] == 1) {
homes[h][0] = i;
homes[h++][1] = j;
}
}
result = Integer.MAX_VALUE;
๋ฐฐ์ด์ ์์ฑํด์ฃผ๊ณ h, c ๋ณ์๋ฅผ ํ์ฉํ์ฌ ์์น ์ ๋ณด๋ฅผ ์ ์ฅํ๋ค. ์ต์๊ฐ์ ์ถ๋ ฅํ๊ธฐ ๋๋ฌธ์ result๋ฅผ ๊ฐ์ฅ ํฐ ์ ์๊ฐ์ผ๋ก ์ธํ ํ๋ค.
static void dfs(int market, int x) {
if (market == M) {
account();
return;
}
for (int i = x; i < chicken; i++) {
if (chickens[i][2] == 1)
continue;
chickens[i][2] = 1;
dfs(market + 1, i);
chickens[i][2] = 0;
}
}
market์ ์ด์ํ ์นํจ ์ง์ ๊ฐ์์ด๋ค. ์ด์ํ ์นํจ ์ง M๊ฐ๋ฅผ ๋ชจ๋ ์ ํํ๋ฉด ์นํจ ๊ฑฐ๋ฆฌ๋ฅผ ์ธก์ ํ๊ณ ํจ์๋ฅผ returnํ์ฌ ์ข ๋ฃํ๋ค.
for๋ฌธ์ ์ด์ฉํ์ฌ ์นํจ์ง ์ด์ ์ํ๋ฅผ 1(์ด์)์ผ๋ก ๋ฐ๊พธ์ด์ฃผ๊ณ ํจ์๋ฅผ ์คํํ ๋ค ๋ค์ ์๋ ๊ฐ์ธ 0์ผ๋ก ์ค์ ํ๋ค.
์ด๋ if๋ฌธ์ ์ค์ ํ์ง ์์ผ๋ฉด ๊ฐ์ ์นํจ์ง M๊ฐ๋ฅผ ์ ํํ ๋ค account๋ฅผ ์คํํ๋ฏ๋ก ์ด๋ฏธ 1๋ก ์ธํ ํ ์นํจ์ง์ for๋ฌธ์์ ์กฐ์ฌํ์ง ์๋๋ค.
static void account() {
int loads = 0;
for (int i = 0; i < home; i++) {
int load = Integer.MAX_VALUE;
for (int j = 0; j < chicken; j++) {
if (chickens[j][2] == 0)
continue;
if (load > Math.abs(homes[i][0] - chickens[j][0]) + Math.abs(homes[i][1] - chickens[j][1]))
load = Math.abs(homes[i][0] - chickens[j][0]) + Math.abs(homes[i][1] - chickens[j][1]);
}
loads += load;
}
if (loads < result)
result = loads;
}
accountํจ์๋ ์นํจ ๊ฑฐ๋ฆฌ๋ฅผ ๊ณ์ฐํ๋ ํจ์์ด๋ค.
์ด๋ loads๋ ์ด ์นํจ ๊ฑฐ๋ฆฌ ๊ฐ์ด๊ณ load๋ ํ ์ง์ ์นํจ ๊ฑฐ๋ฆฌ์ด๋ค.
์ต์๊ฐ์ ๊ตฌํ ๊ฒ์ด๋ฏ๋ก ์ฒ์์ ์ ์์ ์ต๋๊ฐ์ผ๋ก ์ค์ ํ๋ค.
์นํจ์ง์ด ์ด์ํ์ง ์๋ ๊ฒฝ์ฐ if๋ฌธ์ผ๋ก ํ์ธํ ๋ค continue๋ก ๊ทธ ์นํจ์ง์ ๊ฑฐ๋ฆฌ๋ฅผ ๊ณ์ฐํ๋๋ฐ ์ฌ์ฉํ์ง ์๋๋ค.
๋ง์ฝ ๊ณ์ฐ๋ ์นํจ ๊ฑฐ๋ฆฌ ๊ฐ์ด ์๋์ ๊ฐ ๋ณด๋ค ์์ ๊ฒฝ์ฐ ๊ฐ์ ๊ฐฑ์ ํ๋ค.
ํ๋์ ์ง์์ ๊ณ์ฐ๋ ์ต์ ์นํจ ๊ฑฐ๋ฆฌ๋ฅผ load ๋ณ์์ ๋ํ๋ค.
result์ ๊ฐ์ ๊ฐฑ์ ํ๋ค.
15686๋ฒ: ์นํจ ๋ฐฐ๋ฌ
ํฌ๊ธฐ๊ฐ N×N์ธ ๋์๊ฐ ์๋ค. ๋์๋ 1×1ํฌ๊ธฐ์ ์นธ์ผ๋ก ๋๋์ด์ ธ ์๋ค. ๋์์ ๊ฐ ์นธ์ ๋น ์นธ, ์นํจ์ง, ์ง ์ค ํ๋์ด๋ค. ๋์์ ์นธ์ (r, c)์ ๊ฐ์ ํํ๋ก ๋ํ๋ด๊ณ , rํ c์ด ๋๋ ์์์๋ถํฐ r๋ฒ์งธ ์นธ
www.acmicpc.net
'๐ Problem Solving > ๐ป Samsung SW Expert' ์นดํ ๊ณ ๋ฆฌ์ ๋ค๋ฅธ ๊ธ
[JAVA] BOJ ๋ฐฑ์ค 16235 ๋๋ฌด ์ฌํ ํฌ (0) | 2023.02.17 |
---|---|
[JAVA] BOJ ๋ฐฑ์ค 15684 ์ฌ๋ค๋ฆฌ ์กฐ์ (0) | 2023.02.03 |
[JAVA] BOJ ๋ฐฑ์ค 15683 ๊ฐ์ (0) | 2023.01.29 |
[JAVA] BOJ ๋ฐฑ์ค 14891 ํฑ๋๋ฐํด (1) | 2023.01.29 |
[JAVA] BOJ ๋ฐฑ์ค 14889 ์คํํธ์ ๋งํฌ (0) | 2023.01.29 |