https://www.acmicpc.net/problem/17135
๋ฌธ์ ์ค๋ช
์บ์ฌ ๋ํ์ค ๐ ์ฑ์ ํฅํด ๋ชฐ๋ ค์ค๋ ์ ์ ์ก๋ ํด ๋ฐฉ์ ๊ฒ์
NxM ํฌ๊ธฐ์ ๊ฒฉ์ํ์์ ์งํ
N๋ฒํ ๋ฐ๋ก ์๋(N+1๋ฒ ํ)์ ๋ชจ๋ ์ด์ ์ฑ์ด ์กด์ฌ
๊ถ์
๐ 3๋ช
์กด์ฌ
๐ ๊ฐ ํด๋ง๋ค ์ ํ๋๋ฅผ ๊ณต๊ฒฉ ๊ฐ๋ฅ, ๋ชจ๋ ๊ถ์๋ ๋์ ๊ณต๊ฒฉ
๐ ๊ฑฐ๋ฆฌ๊ฐ D์ดํ์ธ ์ ์ค ๊ฐ์ฅ ๊ฐ๊น์ด ์
- ์ฌ๋ฟ์ผ ๊ฒฝ์ฐ, ๊ฐ์ฅ ์ผ์ชฝ์ ์๋ ์ ๊ณต๊ฒฉ
- ($r_1$,$c_1$), ($r_2$,$c_2$)์ ๊ฑฐ๋ฆฌ = |$r_1$-$r_2$| + |$c_1$-$c_2$|
ํด์ด ๋๋๋ฉด ์ ์ ์๋๋ก ํ ์นธ ์ด๋, N+1ํ์ด ๋๋ฉด ๊ฒ์์์ ์ ์ธ ๐ ๋ชจ๋ ์ ์ด ์ ์ธ๋๋ฉด ์ข
๋ฃ
์ ๊ฑฐํ ์ ์๋ ์ ์ ์ต๋ ์ ์ถ๋ ฅ
๋ฌธ์ ํ์ด
1. 3๋ช ์ ๊ถ์๋ฅผ ๋ฐฐ์นํ ์์น ์ ํ
selArchers(cnt, idx, combiOfArcher)
cnt
: ์ ํ๋ ๊ถ์์ ์idx
: ์ ํ๋ ์ด ๊ฐ์ ๋ค์ ๊ฐcombiOfArcher
: 3๋ช
์ ์ ํ๋ ๊ถ์์ ์ด ๊ฐ ๋ฐฐ์ด
for๋ฌธ์ ๋๋ฉด์ combiOfArcher์ 0~N-1 ์ค 3๊ฐ์ ์กฐํฉ์ ์ ํ
์ธ ์์น๊ฐ ๋ชจ๋ ์ ํ๋๋ฉด ๊ณต๊ฒฉ~!!
2. ๊ณต๊ฒฉ && kill ์
attack(combiOfArcher)
์๋๋ ํ ํด์ด ๋๋๋ฉด ์ ์ด ์์ผ๋ก ์ด๋ํ์ง๋ง, ๊ถ์์ ํ์ ์ฎ๊ธฐ๋ ๊ฒ์ด ๋ ๊ฐ๋จํ์ฌ ๊ทธ๊ฒ์ผ๋ก ๊ตฌํ
turn์ ๊ฐ์ด N๋ณด๋ค ์์ ๋์ ๋ฐ๋ณต
๊ถ์์ ํ ์์น : x = N - turn
๊ถ์์ ์ด ์์น : y = combiOfArcher[k]
๊ณต๊ฒฉ๊ฐ๋ฅํ ์ ์ ํ์
๐ D์ดํ ๊ฑฐ๋ฆฌ ์ค, ๊ฐ์ฅ ๊ฐ๊น๊ณ ์ผ์ชฝ์ธ ์ ์ ์์น๋ฅผ q์ new int[]{minX, minY} ์ ์ฅ
๋ชจ๋ ํ์ํ๋ฉด, ๊ณต๊ฒฉ killOfTurn += 1;
์ฝ๋
import java.io.BufferedReader;
import java.io.IOException;
import java.io.InputStreamReader;
import java.util.Arrays;
import java.util.LinkedList;
import java.util.Queue;
import java.util.StringTokenizer;
public class Main_BOJ_17135_์บ์ฌ_๋ํ์ค {
static int N, M, D, ans = Integer.MIN_VALUE;
static int[][] enemyOfMap, copyOfMap;
static int[] archer;
public static void main(String[] args) throws IOException {
BufferedReader br = new BufferedReader(new InputStreamReader(System.in));
StringTokenizer stringTokenizer = new StringTokenizer(br.readLine());
N = Integer.parseInt(stringTokenizer.nextToken());
M = Integer.parseInt(stringTokenizer.nextToken());
D = Integer.parseInt(stringTokenizer.nextToken());
enemyOfMap = new int[N][M];
copyOfMap = new int[N][M];
for (int i = 0; i < N; i++) {
stringTokenizer = new StringTokenizer(br.readLine());
for (int j = 0; j < M; j++) {
enemyOfMap[i][j] = Integer.parseInt(stringTokenizer.nextToken());
}
}
archer = new int[M];
for (int i = 0; i < M; i++) {
archer[i] = i;
}
int[] combiOfArcher = new int[3];
selArchers(0, 0, combiOfArcher);
System.out.println(ans);
}
private static void selArchers(int cnt, int idx, int[] combiOfArcher) {
if (cnt == 3) {
ans = ans < attack(combiOfArcher) ? attack(combiOfArcher) : ans;
return;
}
for (int i = idx; i < archer.length; i++) {
combiOfArcher[cnt] = archer[i];
selArchers(cnt + 1, idx + 1, combiOfArcher);
}
}
private static int attack(int[] combiOfArcher) {
for(int i = 0 ; i < N ; i++)
copyOfMap[i] = Arrays.copyOf(enemyOfMap[i], M);
int killOfTurn = 0;
int turn = 0;
Queue<int[]> q = new LinkedList<>();
while (turn < N) {
for (int k = 0; k < 3; k++) {
int x = N - turn;
int y = combiOfArcher[k];
int min = Integer.MAX_VALUE;
int minX = -1;
int minY = -1;
for (int i = N - turn - 1; i >= 0; i--) {
for (int j = 0; j < M; j++) {
if (copyOfMap[i][j] == 1) {
int dist = Math.abs(i - x) + Math.abs(j - y);
if(dist > D) continue;
// System.out.println("M : " + M + " dist: " + dist);
if (dist < min) {
min = dist;
minX = i;
minY = j;
} else if (dist == min) {
if (j < minY) {
minX = i;
minY = j;
}
}
}
}
}
if(minX == -1 || minY == -1) continue;
q.offer(new int[]{minX, minY});
// System.out.println("turn : " + turn + " x : " + minX + " y : " + minY + " dist : " + min);
}
while (!q.isEmpty()) {
int x = q.peek()[0];
int y = q.poll()[1];
if(copyOfMap[x][y] == 1){
copyOfMap[x][y] = 0;
killOfTurn += 1;
}
// System.out.println("turn : " + turn + " x : " + x + " y : " + y + " kill : " + killOfTurn);
}
turn += 1;
}
return killOfTurn;
}
}
'์๊ณ ๋ฆฌ์ฆ > ๋ฐฑ์ค' ์นดํ ๊ณ ๋ฆฌ์ ๋ค๋ฅธ ๊ธ
[ ๋ฐฑ์ค / BOJ 17779 ] ๊ฒ๋ฆฌ๋ฉ๋๋ง_2 ( ์๋ฐ / JAVA ) (0) | 2022.02.02 |
---|---|
[ ๋ฐฑ์ค / BOJ 17140 ] ์ด์ฐจ์ ๋ฐฐ์ด๊ณผ ์ฐ์ฐ ( ์๋ฐ / JAVA ) (0) | 2022.02.02 |
[ ๋ฐฑ์ค / BOJ 16236 ] ์๊ธฐ ์์ด ( ์๋ฐ/JAVA ) (0) | 2022.01.30 |
[ ๋ฐฑ์ค / BOJ 17144 ] ๋ฏธ์ธ๋จผ์ง ์๋ ! ( JAVA ) (0) | 2022.01.30 |
[ ๋ฐฑ์ค / BOJ 21610 ] ๋ง๋ฒ์ฌ ์์ด์ ๋น๋ฐ๋ฆฌ๊ธฐ ( JAVA ) (0) | 2022.01.30 |