๐SWEA_SW_2112
๐ [SW_2112] ๋ณดํธ ํ๋ฆ
import java.io.BufferedReader;
import java.io.IOException;
import java.io.InputStreamReader;
import java.util.Arrays;
import java.util.StringTokenizer;
public class Solution {
static int D, W, K;
static final int A = 0, B = 1;
static int[][] arr;
static int[] drugA, drugB;
static int min;
public static void main(String[] args) throws IOException {
StringTokenizer st = null;
BufferedReader br = new BufferedReader(new InputStreamReader(System.in));
StringBuilder sb = new StringBuilder();
int TC = Integer.parseInt(br.readLine());
for (int tc = 1; tc <= TC; tc++) {
sb.append("#").append(tc).append(" ");
st = new StringTokenizer(br.readLine(), " ");
// ๋ง ๋๊ป
D = Integer.parseInt(st.nextToken());
// ๋ง ๋๋น
W = Integer.parseInt(st.nextToken());
// ํฉ๊ฒฉ๊ธฐ์ค ์ฐ์ ์
์ ๊ฐ์
K = Integer.parseInt(st.nextToken());
min = Integer.MAX_VALUE;
arr = new int[D][W];
// ํ์ค์ฉ ๋ฐ๊ฟ ๋ฐฐ์ด
drugA = new int[W];
drugB = new int[W];
for (int i = 0; i < D; i++) {
st = new StringTokenizer(br.readLine(), " ");
for (int j = 0; j < W; j++) {
arr[i][j] = Integer.parseInt(st.nextToken());
}
}
Arrays.fill(drugA, A);
Arrays.fill(drugB, B);
process(0, 0);
sb.append(min).append("\n");
}
System.out.println(sb);
}
// ๋ณดํธํ๋ฆ์ ์ฑ๋ฅ๊ฒ์ฌ
static boolean check() {
// ์ด ๊ณ ์ ํ ํ์ ์ฐ์๋ ์
์ ๊ฐ์ ํน์ฑ์ด K๊ฐ ์ด์์ธ์ง ๊ฒ์ฌ
// ์ด๊ณ ์
for (int i = 0; i < W; i++) {
int count = 1;
int before = arr[0][i];
for (int j = 1; j < D; j++) {
int current = arr[j][i];
// ์ฐ์๋ ๋ ์
์ ๊ฐ์ด ๊ฐ๋ค
if (before == current) {
count++;
if (count == K)
break;
}
// ๋ค๋ฅด๋ฉด ์๋ก ์นด์ดํ
else {
before = current;
count = 1;
}
} // ํ๋์ ์ด์ ๊ณ ์ ํด์ ์์ง์ผ๋ก ๊ฒ์ฌ
if (count < K)
return false;
}
return true;
}
// ๊ฐ ๋ง์ ๋ถ๋ถ์งํฉ์ผ๋ก ์ฝํ ๋นํฌ์ฌ, ์ฝํA ํฌ์ฌ, ์ฝํB ํฌ์ฌ
static boolean process(int row, int useCnt) {
// ๊ธฐ์ ์กฐ๊ฑด ( ๋ง์ง๋งํ๊น์ง ์์ ๋ฒ์ด๋ ๊ฒ )
if (row == D) {
// ์ฑ๋ฅ๊ฒ์ฌ
if (check()) {
// ๋ ์ต์๊ฐ ์ ์ฅ
min = Math.min(min, useCnt);
// ์ฝํ์ ํ๋๋ ์ฌ์ฉํ์ง ์์์ผ๋ฉด(0) true, ์ฌ์ฉํ์ผ๋ฉด(!0) false
return min == 0;
}
// ์ฑ๋ฅ๊ฒ์ฌ ํต๊ณผ X
return false;
}
// ์ง๊ธ๊น์ง ์ฌ์ฉํ ์ฝํ์ ์๊ฐ ์ด๋ฏธ ์ต์๊ฐ๋ณด๋ค ๊ฐ๊ฑฐ๋ ์ปค๋ return
// ๋ค์ ๋ ๋ณผํ์๊ฐ ์๋ค. ์ด๋ฏธ ์ต์๋ ์๋จ
if (useCnt >= min) {
return false;
}
// ๋ฐฑ์
๋ฐฐ์ด ( ํ์ฌ ๋ง์ ์ํ๋ฐฐ์ด ๊ธฐ์ต )
int[] backup = arr[row];
// ์ฝํ ๋นํฌ์ฌ - ์ฝํ cnt ๋ ๊ทธ๋๋ก
if (process(row + 1, useCnt))
return true;
// ์ฝํ A ํฌ์ฌ
// ์ฝํ์ด ํฌ์ฌ๋ ์ํ๋ก ๋ณดํธํ๋ฆ์ ๋ฐ๊ฟ์ผ ํ๋ค.
arr[row] = drugA;
if (process(row + 1, useCnt + 1))
return true;
// ์ฝํ B ํฌ์ฌ
arr[row] = drugB;
if (process(row + 1, useCnt + 1))
return true;
// ๊ธฐ์กด ๋ง์ ์ํ๋ก ๋ค์ ๋ฐ๊ฟ๋๊ธฐ
arr[row] = backup;
return false;
}
}
๐ค ๋์ ์๊ฐ
์๋ฎฌ๋ ์ด์
๋ฌธ์ ์ด๋ค.
ํด๊ฒฐ ๋ฐฉ๋ฒ์ ํค ํฌ์ธํธ๋ ํน์ฑ A ํ ํ๋์ ํน์ฑ B ํ ํ๋๋ฅผ ์ค์ ํด๋๊ณ ๋ฐ๊ฟ๊ฐ๋ฉฐ ์ฒดํฌํ๋ ๊ฒ์ด๋ค.
๊ธฐ์กด ํ์ ๋ฐฑ์
ํ์ผ๋ก ๋๊ณ ๋ฐ๊ฟ๊ฐ๋ฉฐ ํ์ธํ๋ค.
์ฒ์์ ๊ธฐ์กด ํ๋ค๋ก ํ์ธํด์ check ๊ฐ ์๋๋ฉด A ๋จผ์ ๋ฃ์ด๋ณด๊ณ ์๋๋ฉด ๋ค์ ๋ฐฑ์
ํด์ ๊ทธ๋ด ํ ํ์ธํ๊ณ ์ด๋ฐ ์์ผ๋ก ์งํ๋๋ค.