๋ฌธ์ ์ ๋ฆฌ
- ๋ฐฐ์ด์ ์ต์๊ฐ์ ๊ตฌํ๋ค.
- ๋ฐฐ์ด์ ์ต์๊ฐ์ ๊ฐ ํ์ ๋ชจ๋ ์์์ ํฉ ์ค ๊ฐ์ฅ ์์ ๊ฐ์ด๋ค.
- ๋ฐฐ์ด์ด ์ฃผ์ด์ง๋ฉด k๋ฒ์ ํ์ ์ ํ๋ค.
- ๊ฐ ํ์ ์ r, c, s ๊ฐ์ผ๋ก ํ์ ํ๋ค.
- (r-s, c-s) ๋ถํฐ (r+s, c+s) ๊น์ง ์๊ณ ๋ฐฉํฅ์ผ๋ก ํ์ ํ๋ค.
- ํ์ ์ฐ์ฐ์ด ๋ ๊ฐ ์ด์์ด๋ฉด, ์ฐ์ฐ์ ์ํํ ํ์์ ๋ฐ๋ผ ์ต์ข ๋ฐฐ์ด์ด ๋ฌ๋ผ์ง๋ค.
์ ํ ์ฌํญ
- 3 โค N, M โค 50
- 1 โค K โค 6
- 1 โค A[i][j] โค 100
- 1 โค s
- 1 โค r-s < r < r+s โค N
- 1 โค c-s < c < c+s โค M
ํต์ฌ ํฌ์ธํธ
- ๋ค๋ฅธ ์ฐ์ฐ์ด ์กด์ฌํ๋ฏ๋ก ๋ฐฑํธ๋ํน
- ๋ฐฑํธ๋ํน์ผ๋ก ๊ตฌํ ์ ์๋ ๋ชจ๋ ์ฐ์ฐ ๊ณผ์ ์ด ์ ์ผ๋ฏ๋ก ์์ ํ์ ๊ฐ๋ฅ
- ๋ฐฐ์ด ํ์ ์ ์ต์ข ๊ฒฐ๊ณผ๋ก ์ต์ข ๋ฐฐ์ด์ ํ๋ ํ ์ ์์ผ๋ฏ๋ก ๊ฐ์ง์น๊ธฐ ํ์ ์์.
- ๋ฐฐ์ด ํ์ ์ ๋ํ ๊ตฌํ๋ ฅ ํ์
ํต์ฌ ๋ก์ง
- ๋ฐฑํธ๋ํน์ ํตํด ๋ค๋ฅธ ๊ฒฝ์ฐ์ ๋ํ ํ์ ์ํ ์ ์ฅํ๋ ๋ก์ง
- ๋ฐฐ์ด ์์ ์ง์ ๋ถํฐ ์ข ๋ฃ ์ง์ ๊น์ง์ ์๊ณ ๋ฐฉํฅ ํ์ ๋ก์ง
- ์ต์ข ๋ฐฐ์ด์์ ์ต์ ๊ฐ์ ์ฐพ๋ ๋ก์ง
์ฝ๋
package com.study.baekjoon.bruteforce_with_backtracking.boj17406;
import java.io.BufferedReader;
import java.io.IOException;
import java.io.InputStreamReader;
import java.util.Arrays;
import java.util.StringTokenizer;
public class Main {
static class Rotation {
int r, c, s;
public Rotation(int r, int c, int s) {
this.r = r;
this.c = c;
this.s = s;
}
}
static BufferedReader br = new BufferedReader(new InputStreamReader(System.in));
static StringTokenizer st;
static int n, m, k;
static int[][] arr = new int[51][51];
static int[][] tempArr = new int[51][51];
static boolean[] visited = new boolean[6];
static Rotation[] rotationOrder = new Rotation[6];
static int minValue = Integer.MAX_VALUE;
public static void main(String[] args) throws IOException {
Rotation[] rotations = input();
backtrack(rotations, 0);
System.out.println(minValue);
}
private static Rotation[] input() throws IOException {
st = new StringTokenizer(br.readLine());
n = Integer.parseInt(st.nextToken());
m = Integer.parseInt(st.nextToken());
k = Integer.parseInt(st.nextToken());
for (int i = 1; i <= n; i++) {
st = new StringTokenizer(br.readLine());
for (int j = 1; j <= m; j++) {
arr[i][j] = Integer.parseInt(st.nextToken());
}
}
Rotation[] rotations = new Rotation[k];
for (int i = 0; i < k; i++) {
st = new StringTokenizer(br.readLine());
int r = Integer.parseInt(st.nextToken());
int c = Integer.parseInt(st.nextToken());
int s = Integer.parseInt(st.nextToken());
rotations[i] = new Rotation(r, c, s);
}
return rotations;
}
private static void backtrack(Rotation[] rotations, int depth) {
if (depth == k) {
for (int i = 1; i <= n; i++) tempArr[i] = Arrays.copyOf(arr[i], arr[i].length);
for (int i = 0; i < k; i++) rotateArray(i);
calculateArrayValue();
return;
}
for (int i = 0; i < k; i++) {
if (!visited[i]) {
visited[i] = true;
rotationOrder[depth] = rotations[i];
backtrack(rotations, depth + 1);
visited[i] = false;
}
}
}
private static void rotateArray(int idx) {
int r = rotationOrder[idx].r;
int c = rotationOrder[idx].c;
int s = rotationOrder[idx].s;
for (int layer = 1; layer <= s; layer++) {
int sr = r - layer, sc = c - layer;
int er = r + layer, ec = c + layer;
int temp = tempArr[sr][sc];
for (int i = sr; i < er; i++) tempArr[i][sc] = tempArr[i+1][sc];
for (int j = sc; j < ec; j++) tempArr[er][j] = tempArr[er][j+1];
for (int i = er; i > sr; i--) tempArr[i][ec] = tempArr[i-1][ec];
for (int j = ec; j > sc; j--) tempArr[sr][j] = tempArr[sr][j-1];
tempArr[sr][sc+1] = temp;
}
}
private static void calculateArrayValue() {
int minSum = Integer.MAX_VALUE;
for (int i = 1; i <= n; i++) {
int rowSum = 0;
for (int j = 1; j <= m; j++) {
rowSum += tempArr[i][j];
}
minSum = Math.min(minSum, rowSum);
}
minValue = Math.min(minValue, minSum);
}
}
ํต์ฌ ๋ก์ง ์ถ๊ฐ ์ค๋ช

๊ฐ์ : Rotattion๊ฐ 3๊ฐ๊ฐ ์์
1. r0, r1, r2 ์์๋ก ํ์ ์ฐ์ฐ ์ ๋ณด๋ฅผ ์ ์ฅ
2. ๋ฐฑํธ๋ํน ๊ณผ์ ์์ r0, r2, r1 ์์์ ํ์ ์ฐ์ฐ ์ ๋ณด๋ ์ ์ฅํ๊ฒ ๋จ

1. ์ค์ฌ์ ์ผ๋ก ๋ถํฐ s์ ๊ฐ์๋งํผ ํ์
2. (r - 1, c - 1) to (r + 1, c + 1)๊น์ง ๊ฐ ๊ฐ ํ์ ํ๋ ๊ตฌํ

๋ฌธ์ ์ถ์ฒ: https://www.acmicpc.net/problem/17406
'์๊ณ ๋ฆฌ์ฆ > ๋ฐฑ์ค' ์นดํ ๊ณ ๋ฆฌ์ ๋ค๋ฅธ ๊ธ
[BOJ 9252] LCS2 (0) | 2025.04.08 |
---|---|
[BOJ 1826] ์ฐ๋ฃ ์ฑ์ฐ๊ธฐ (0) | 2025.03.31 |
[BOJ 20207] ๋ฌ๋ ฅ (0) | 2025.03.31 |
๋ฐฑ์ค - [BOJ 22856] ํธ๋ฆฌ ์ํ (0) | 2024.07.08 |
๋ฐฑ์ค - [BOJ 1865] ์ํ (0) | 2024.07.06 |