2 ๋ถ„ ์†Œ์š”

๐Ÿ“ [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 ๋จผ์ € ๋„ฃ์–ด๋ณด๊ณ  ์•ˆ๋˜๋ฉด ๋‹ค์‹œ ๋ฐฑ์—…ํ•ด์„œ ๊ทธ๋‹ด ํ–‰ ํ™•์ธํ•˜๊ณ  ์ด๋Ÿฐ ์‹์œผ๋กœ ์ง„ํ–‰๋œ๋‹ค.