ํผ ๊ณผ์
๋ฐฐ์ด์ ์ด๋ ์ฐ์ฐ์ด K๊ฐ ์ฃผ์ด์ง๋ฉด ๊ทธ K๊ฐ๋ฅผ ๋ชจ๋ 1๋ฒ์ฉ์ ์ฌ์ฉํ ํ ๋ฐฐ์ด์ ์ต์๊ฐ์ ๊ตฌํ๋ ๊ฒ์ด๋ค.
๋ฐฐ์ด์ ํ์ ์ฐ์ฐ K๊ฐ๋ฅผ ์ด๋ค ์์๋ก ํ๋๋์ ๋ฐ๋ผ ์ต์ข ๋ฐฐ์ด์ ๋ชจ์ต์ด ๋ฌ๋ผ์ง๊ฒ ๋๋ฏ๋ก ์ฒ์ ์๊ฐํด๋ธ ์์ด๋์ด๋ '์์ด'์ด์๋ค. ๊ทธ๋์ ์ฃผ์ด์ง ์ด๋์ฐ์ฐ๋ค์ 2์ฐจ์ ๋ฐฐ์ด์ ๋ด์ ์ธ๋ฑ์ค๋ฅผ ์์ด๋ก ๋ฝ๋ ์๊ณ ๋ฆฌ์ฆ์ ์๊ฐํ๋ค. ๊ทธ๋ ๊ฒ K๊ฐ๊ฐ ๋ฝํ๊ฒ ๋๋ค๋ฉด, ํ์ ์ฐ์ฐ์ ์ํํ๋ฉด ๋ ๊ฒ ๊ฐ์๋ค.
ํ์ ์ฐ์ฐ์ ๊ฒฝ์ฐ ์ด์ ์ ํ์๋ boj.kr/17144 ๋ฌธ์ ์์ ์์ด๋์ด๋ฅผ ์ป์ด ํด๋น ๊ตฌ์ญ๋ค์ ๋ด์ผ๋ ค๊ณ ํ์ผ๋... ๊ตฌ์ญ์ ์ด๋ป๊ฒ ๋ด๋์ง ์๊ฐํ๋ ๊ฒ๋ณด๋ค ๊ทธ๋ฅ 4๋ฒ์ for๋ฌธ์ ๋๋ฆฌ๋ ๊ฒ์ด ํจ์ฌ ๋น ๋ฅด๊ฒ ๊ตฌํ์ด ๋๋ ๊ฒ ๊ฐ์์ 4๋ฒ์ for๋ฌธ์ผ๋ก ์ง์ ํ์ ์ฐ์ฐ์ ๊ตฌํํ๋ค. ํ์ ์ฐ์ฐ์ ์ํํ ๋ ์ฒซ ๊ฐ๋ง tmp ๋ณ์์ ๋ด์๋๊ณ ํ ๋ฐํด๋ฅผ ๋๋ฆฐ ๋ค์ ๋ง์ง๋ง ์์น์๋ค๊ฐ tmp ๊ฐ์ ๋ฃ์ด์ฃผ๊ธฐ๋ง ํ๋ฉด ๊ตฌํํ ์ ์๋ค.
๊ทผ๋ฐ ์๊ฐํด์ผ ํ๋ ๊ฒ์ ์ขํ๊ฐ ์ ์ ์์ชฝ์ผ๋ก ๋ค์ด๊ฐ๋ค๋ ์ ์ด๋ค. ์ฒ์์ ์ฃผ์ด์ง ์ผ์ชฝ ์ ์ขํ์ ์ค๋ฅธ์ชฝ ์๋ ์ขํ์ ๋ณํ๋ฅผ ๋ณด๋ฉด ๋ค์๊ณผ ๊ฐ๋ค.

- A[1][2] → A[2][3] → A[3][4]
- A[5][6] → A[4][5] → A[3][4]
์ด๋ฅผ ํตํด ์ ์ ์๋๊ฑด ์ผ์ชฝ ์ ์ขํ๋ ํ ๋ฒ์ ํ์ ์ฐ์ฐ ํ x + 1, y + 1๋ก ์ขํ๊ฐ ๋ณํํ๊ณ ์ค๋ฅธ์ชฝ ์๋ ์ขํ๋ ํ ๋ฒ์ ํ์ ์ฐ์ฐ ํ x - 1, y - 1๋ก ์ขํ๊ฐ ๋ณํํ๋ค. ๊ทธ๋ผ ๋์ ์ขํ๊ฐ ๊ฐ์์ง๊ฑฐ๋ ์ผ์ชฝ ์ ์ขํ๊ฐ ์ค๋ฅธ์ชฝ ์๋ ์ขํ๋ณด๋ค ์ค๋ฅธ์ชฝ์ ์ค๋ ์๊ฐ์ ํ์ ์ ๋ฉ์ถ๋ฉด ๋๋ค.
์ด๋ฐ ์๊ฐ์ ๊ธฐ๋ฐ์ผ๋ก ๋ค์๊ณผ ๊ฐ์ด ์ฝ๋๋ฅผ ์งฐ๋ค.
์ฝ๋
/**
* 17406 - ๋ฐฐ์ด ๋๋ฆฌ๊ธฐ 4 [์ฑ๊ณต(๋ฐ๋กํํธ)|01:06:16]
* ๊ณจ๋4, ๊ตฌํ/์์ ํ์, ์๋3
*/
import java.io.*;
import java.util.StringTokenizer;
public class Main {
// ์๊ฐ์ ํ 1์ด, ๋ฉ๋ชจ๋ฆฌ์ ํ 512MB
// ํฌ๊ธฐ N*M์ธ ๋ฐฐ์ด A
// ๋ฐฐ์ด A์ ๊ฐ == ๊ฐ ํ์ ์๋ ๋ชจ๋ ์์ ํฉ ์ค ์ต์๊ฐ
// 1 2 3
// 2 1 1
// 4 5 6
// ๋ฐฐ์ด A์ ๊ฐ = 4
// ํ์ ์ฐ์ฐ ๊ฐ๋ฅ (r,c,s)
// ๊ฐ์ฅ ์ผ์ชฝ ์ ์นธ (r-s, c-s)
// ๊ฐ์ฅ ์ค๋ฅธ์ชฝ ์๋ ์นธ (r+s, c+s)
// ๋ฐฐ์ด A์ ํ์ ์ฐ์ฐ์ด ์ฃผ์ด์ง๋ฉด ํ์ ์ฐ์ฐ์ ๋ชจ๋ ํ ๋ฒ์ฉ ์ฌ์ฉํด์ ๋์ค๋ ๋ฐฐ์ด A ๊ฐ์ ์ต์๊ฐ์ ๊ตฌํ์.
// 3 <= N, M <= 50
// ์ผ์ชฝ ์, ์ค๋ฅธ์ชฝ ์๋ ์ขํ ๋๊ฐ์ ์์ผ๋ก ์ด๋ -> ๋์ ์ขํ๊ฐ ๊ฐ์์ง๋ฉด ํ์ stop!!
static int[][] A;
static int[][] rcs;
static int[] idxlist;
static int N, M, K;
static int ret = Integer.MAX_VALUE;
static void swap(int idx1, int idx2) {
int tmp = idxlist[idx1];
idxlist[idx1] = idxlist[idx2];
idxlist[idx2] = tmp;
}
static void permutation(int r) {
if (r == K) {
int[][] m = new int[N][M];
for (int i = 0; i < N; i++)
m[i] = A[i].clone();
// ํ์ ์ฐ์ฐ ์ํ ํ ์ต์๊ฐ ๊ฐฑ์
for (int i = 0; i < K; i++) {
int y1 = rcs[idxlist[i]][0] - rcs[idxlist[i]][2];
int x1 = rcs[idxlist[i]][1] - rcs[idxlist[i]][2];
int y2 = rcs[idxlist[i]][0] + rcs[idxlist[i]][2];
int x2 = rcs[idxlist[i]][1] + rcs[idxlist[i]][2];
while (y1 != y2 || x1 != x2) {
int tmp = m[y1][x1];
for (int y = y1 + 1; y <= y2; y++)
m[y-1][x1] = m[y][x1];
for (int x = x1 + 1; x <= x2; x++)
m[y2][x-1] = m[y2][x];
for (int y = y2 - 1; y >= y1; y--)
m[y+1][x2] = m[y][x2];
for (int x = x2 - 1; x > x1; x--) {
m[y1][x+1] = m[y1][x];
if (x == x1+1) m[y1][x] = tmp;
}
y1++;
x1++;
y2--;
x2--;
}
}
for (int y = 0; y < N; y++) {
int sum = 0;
for (int x = 0; x < M; x++) {
sum += m[y][x];
}
ret = Math.min(sum, ret);
}
return;
}
for (int i = r; i < K; i++) {
swap(i, r);
permutation(r + 1);
swap(i, r);
}
}
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());
M = Integer.parseInt(st.nextToken());
K = Integer.parseInt(st.nextToken());
A = new int[N][M];
for (int i = 0; i < N; i++) {
st = new StringTokenizer(br.readLine());
for (int j = 0; j < M; j++) {
A[i][j] = Integer.parseInt(st.nextToken());
}
}
rcs = new int[K][3];
idxlist = new int[K];
for (int i = 0; i < K; i++) {
st = new StringTokenizer(br.readLine());
rcs[i][0] = Integer.parseInt(st.nextToken())-1;
rcs[i][1] = Integer.parseInt(st.nextToken())-1;
rcs[i][2] = Integer.parseInt(st.nextToken());
idxlist[i] = i;
}
permutation(0);
System.out.println(ret);
}
}
์์ด์์ ๋ฝํ ๊ฒฝ์ฐ์ ์๋ง๋ค ๋ฐฐ์ด A๋ฅผ ์ด๊ธฐ ์ ๋ ฅ๊ฐ์ผ๋ก ์ด๊ธฐํํด์ฃผ์ด์ผ ํ๋๋ฐ, ์ด ๋ถ๋ถ์ ์๊ฐํ์ง ๋ชปํด์ ์ด๋ฏธ ๋๋ฆฐ ๋ฐฐ์ดA์ ๋ํด ๋ ํ์ ์ฐ์ฐ์ ์ํํ๋ค. ๊ทธ๋์ ์ค๋ต์ด ๋์๋๋ฐ, ์ง๋ฌธ ๊ฒ์ํ์ ๋ฐ๋ก๋ฅผ ๋ณด๊ณ ์ด๋ฅผ ํด๊ฒฐํ๋ค.
ํฐ๋๋ ํด์ค
๋ฐฐ์ด A ํ์
(3, 4, 2) → (4, 2, 1)
(4, 2, 1) → (3, 4, 2)
๋ฐฐ์ด์ ๋๋ฆฌ๋ ์์๊ฐ ์๋ค. == ์์ด
๋ชจ๋ ์์๋ฅผ ์ฒดํนํด์ผ ํ๋ฉด์ ๊ฐ์ ๋ฝ์๋ด๋ ๋จ์ ๊ตฌํ ๋ฌธ์
๋ฌธ์ ๋ ๋ ๊ฐ์ง ํํธ๋ก ๋๋จ
- ๋๋ ค์ผ ํ ์์ญ ๋ฝ์๋ด๊ธฐ
์ํ์ผ๋ก ๋ณด์ง๋ง๊ณ 1์ฐจ์์ ์ผ๋ก ์๊ฐํด๋ณด์๋ผ.
rbegin์ด ์๊ฐ๋์ผํจ. (๊ต์ ํ์ธ)
- ์์ญ์ ๋๋ฆฌ๋ ์ฐ์ฐ == rbegin
rbegin์ C++์์ ์ฌ์ฉํ ์ ์๋ ๋ผ์ด๋ธ๋ฌ๋ฆฌ ํจ์์ด๋ฏ๋ก ์๋ฐ์์๋ ์ง์ ๊ตฌํํด์ผํ๋ค.
'์๊ณ ๋ฆฌ์ฆ ๋ฌธ์ ' ์นดํ ๊ณ ๋ฆฌ์ ๋ค๋ฅธ ๊ธ
2632 - ํผ์ํ๋งค (2) | 2024.08.25 |
---|---|
17143 - ๋์์ (0) | 2024.08.24 |
3190 - ๋ฑ [์ฑ๊ณต(๋ฐ๋กํํธ)|02:14:43] (0) | 2024.08.09 |
๋ฐฑ์ค 12094 - 2048 (Hard) [ํ์ด์ฌ] (0) | 2022.11.22 |
๋ฐฑ์ค 12100 - 2048 (Easy) [ํ์ด์ฌ] (0) | 2022.11.20 |