https://www.acmicpc.net/problem/17406
๋ฌธ์
ํฌ๊ธฐ๊ฐ N×M ํฌ๊ธฐ์ธ ๋ฐฐ์ด A๊ฐ ์์๋, ๋ฐฐ์ด A์ ๊ฐ์ ๊ฐ ํ์ ์๋ ๋ชจ๋ ์์ ํฉ ์ค ์ต์๊ฐ์ ์๋ฏธํ๋ค. ๋ฐฐ์ด A๊ฐ ์๋์ ๊ฐ์ ๊ฒฝ์ฐ 1ํ์ ํฉ์ 6, 2ํ์ ํฉ์ 4, 3ํ์ ํฉ์ 15์ด๋ค. ๋ฐ๋ผ์, ๋ฐฐ์ด A์ ๊ฐ์ 4์ด๋ค.
1 | 2 | 3 |
2 | 1 | 1 |
4 | 5 | 6 |
๋ฐฐ์ด์ ํ์ ์ฐ์ฐ์ ์ํํ ์ ์๋ค. ํ์ ์ฐ์ฐ์ ์ธ ์ ์ (r, c, s)๋ก ์ด๋ฃจ์ด์ ธ ์๊ณ , ๊ฐ์ฅ ์ผ์ชฝ ์ ์นธ์ด (r-s, c-s), ๊ฐ์ฅ ์ค๋ฅธ์ชฝ ์๋ซ ์นธ์ด (r+s, c+s)์ธ ์ ์ฌ๊ฐํ์ ์๊ณ ๋ฐฉํฅ์ผ๋ก ํ ์นธ์ฉ ๋๋ฆฐ๋ค๋ ์๋ฏธ์ด๋ค. ๋ฐฐ์ด์ ์นธ (r, c)๋ rํ c์ด์ ์๋ฏธํ๋ค.
์๋ฅผ ๋ค์ด, ๋ฐฐ์ด A์ ํฌ๊ธฐ๊ฐ 6×6์ด๊ณ , ํ์ ์ฐ์ฐ์ด (3, 4, 2)์ธ ๊ฒฝ์ฐ์๋ ์๋ ๊ทธ๋ฆผ๊ณผ ๊ฐ์ด ํ์ ํ๊ฒ ๋๋ค.
ํ์ ์ฐ์ฐ์ด ๋ ๊ฐ ์ด์์ด๋ฉด, ์ฐ์ฐ์ ์ํํ ์์์ ๋ฐ๋ผ ์ต์ข ๋ฐฐ์ด์ด ๋ค๋ฅด๋ค.
๋ค์์ ๋ฐฐ์ด A์ ํฌ๊ธฐ๊ฐ 5×6์ด๊ณ , ํ์ ์ฐ์ฐ์ด (3, 4, 2), (4, 2, 1)์ธ ๊ฒฝ์ฐ์ ์์์ด๋ค.
๋ฐฐ์ด A์ (3, 4, 2), (4, 2, 1) ์์๋ก ์ฐ์ฐ์ ์ํํ๋ฉด ๋ฐฐ์ด A์ ๊ฐ์ 12, (4, 2, 1), (3, 4, 2) ์์๋ก ์ฐ์ฐ์ ์ํํ๋ฉด 15 ์ด๋ค.
๋ฐฐ์ด A์ ์ฌ์ฉ ๊ฐ๋ฅํ ํ์ ์ฐ์ฐ์ด ์ฃผ์ด์ก์ ๋, ๋ฐฐ์ด A์ ๊ฐ์ ์ต์๊ฐ์ ๊ตฌํด๋ณด์. ํ์ ์ฐ์ฐ์ ๋ชจ๋ ํ ๋ฒ์ฉ ์ฌ์ฉํด์ผ ํ๋ฉฐ, ์์๋ ์์๋ก ์ ํด๋ ๋๋ค.
์ ๋ ฅ
์ฒซ์งธ ์ค์ ๋ฐฐ์ด A์ ํฌ๊ธฐ N, M, ํ์ ์ฐ์ฐ์ ๊ฐ์ K๊ฐ ์ฃผ์ด์ง๋ค.
๋์งธ ์ค๋ถํฐ N๊ฐ์ ์ค์ ๋ฐฐ์ด A์ ๋ค์ด์๋ ์ A[i][j]๊ฐ ์ฃผ์ด์ง๊ณ , ๋ค์ K๊ฐ์ ์ค์ ํ์ ์ฐ์ฐ์ ์ ๋ณด r, c, s๊ฐ ์ฃผ์ด์ง๋ค.
์ถ๋ ฅ
๋ฐฐ์ด A์ ๊ฐ์ ์ต์๊ฐ์ ์ถ๋ ฅํ๋ค.
ํ์ด
๊ตฌํ๊ณผ ๋ธ๋ฃจํฌํฌ์ค ์๊ณ ๋ฆฌ์ฆ ๋ฌธ์
makePerm ํจ์๋ก ํ์ ์ฐ์ฐ์ ์์๋ฅผ ์ ํ๋ค.
K๊ฐ์ ํ์ ์ฐ์ฐ๋ค์ด ์ ํ๋๋ฉด โก๏ธ calPoint๋ก ๋ฐ๊นฅ์ชฝ๋ถํฐ ์์ชฝ๊น์ง ํ์ ํ ๊ฐ์ฅ ์ผ์ชฝ ๋งจ ์์นธ ์ขํ์ ๊ฐ์ฅ ์ค๋ฅธ์ชฝ ์๋ซ์นธ ์ขํ๋ฅผ ๊ตฌํ๊ณ โก๏ธ rotateArr ํจ์๋ก ํ์ ์ํจ๋ค. โก๏ธ ๋ชจ๋ ํ์ ์ฐ์ฐ์ด ๋๋๋ฉด ๊ฐ์ฅ ์ต์ ํ์ ํฉ์ ๊ตฌํ๋ค.
๋จ์ ๊ตฌํ์ธ๋ฐ.... ๊ท์ฐฎํ..ใ ..ใ
์ฝ๋
import java.io.BufferedReader;
import java.io.IOException;
import java.io.InputStreamReader;
import java.util.ArrayList;
import java.util.Arrays;
import java.util.LinkedList;
import java.util.StringTokenizer;
public class Main_BOJ_17406_๋ฐฐ์ด๋๋ฆฌ๊ธฐ4 {
static int N, M, K;
static int min = Integer.MAX_VALUE;
static int[][] arr, rcs;
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());
K = Integer.parseInt(stringTokenizer.nextToken());
arr = new int[N][M];
rcs = new int[K][3];
for(int i = 0 ; i < N ; i++){
stringTokenizer = new StringTokenizer(br.readLine());
for(int j = 0 ; j < M ; j++){
arr[i][j] = Integer.parseInt(stringTokenizer.nextToken());
}
}
for(int i = 0; i < K ; i++){
stringTokenizer = new StringTokenizer(br.readLine());
rcs[i][0] = Integer.parseInt(stringTokenizer.nextToken());
rcs[i][1] = Integer.parseInt(stringTokenizer.nextToken());
rcs[i][2] = Integer.parseInt(stringTokenizer.nextToken());
}
makePerm(new boolean[K], new LinkedList<Integer>());
System.out.println(min);
}
private static void makePerm(boolean[] isVisited, LinkedList<Integer> listRotate) {
if(listRotate.size() == K){
int[][] arrCopy = copyArr();
// ๋ฝํ ์์๋๋ก ๋๋ฆฌ๊ธฐ
for(int l : listRotate){
int r = rcs[l][0];
int c = rcs[l][1];
int s = rcs[l][2];
calPoint(arrCopy, r, c, s);
}
min = Math.min(min, calRow(arrCopy));
}
for(int i = 0; i < K ; i++){
if(!isVisited[i]){
isVisited[i] = true;
listRotate.add(i);
makePerm(isVisited, listRotate);
isVisited[i] = false;
listRotate.removeLast();
}
}
}
private static int calRow(int[][] arrCopy) {
int minSum = Integer.MAX_VALUE;
for(int i = 0 ; i < N ; i++){
int sum = 0;
for(int j = 0 ; j < M ; j++){
sum += arrCopy[i][j];
}
System.out.println(sum);
minSum = Math.min(minSum, sum);
}
return minSum;
}
private static void calPoint(int[][] arrCpy, int r, int c, int s) {
for(int i = 0 ; i < s ; i++){
int r1 = r - s + i - 1;
int c1 = c - s + i - 1;
int r2 = r + s - i - 1;
int c2 = c + s - i - 1;
rotateArr(arrCpy, r1, c1, r2, c2);
}
}
private static void rotateArr(int[][] arrCpy, int r1, int c1, int r2, int c2) {
int tmp = arrCpy[r1][c1];
// ์ผ์ชฝ ์ด
for(int r = r1+1 ; r <= r2 ; r++){
arrCpy[r-1][c1] = arrCpy[r][c1];
}
// ๋งจ ๋ฐ ํ
for(int c = c1+1 ; c <= c2 ; c++){
arrCpy[r2][c-1] = arrCpy[r2][c];
}
// ์ค๋ฅธ์ชฝ ์ด
for(int r = r2-1; r >= r1 ; r--){
arrCpy[r+1][c2] = arrCpy[r][c2];
}
// ๋งจ ์ ํ
for(int c = c2-1 ; c > c1 ; c--){
arrCpy[r1][c+1] = arrCpy[r1][c];
}
arrCpy[r1][c1+1] = tmp;
}
private static int[][] copyArr() {
int[][] tmp = new int[N][M];
for(int i = 0 ; i < N ; i++)
tmp[i] = Arrays.copyOf(arr[i], M);
return tmp;
}
}
'์๊ณ ๋ฆฌ์ฆ > ๋ฐฑ์ค' ์นดํ ๊ณ ๋ฆฌ์ ๋ค๋ฅธ ๊ธ
[ ๋ฐฑ์ค / BOJ 1958 ] LCS 3 (0) | 2021.09.15 |
---|---|
[๋ฐฑ์ค / BOJ 12871] ๋ฌดํ ๋ฌธ์์ด (0) | 2021.09.14 |
[๋ฐฑ์ค / BOJ 18427] ํจ๊ป ๋ธ๋ก ์๊ธฐ (0) | 2021.09.14 |
[๋ฐฑ์ค / BOJ 2109] ์ํ๊ฐ์ฐ (0) | 2021.09.14 |
[๋ฐฑ์ค / BOJ 2026] ์ํ (0) | 2021.09.14 |