๋ณธ๋ฌธ์œผ๋กœ ๋ฐ”๋กœ๊ฐ€๊ธฐ

https://swexpertacademy.com/main/code/problem/problemDetail.do?contestProbId=AV5V1SYKAaUDFAWu 

 

SW Expert Academy

SW ํ”„๋กœ๊ทธ๋ž˜๋ฐ ์—ญ๋Ÿ‰ ๊ฐ•ํ™”์— ๋„์›€์ด ๋˜๋Š” ๋‹ค์–‘ํ•œ ํ•™์Šต ์ปจํ…์ธ ๋ฅผ ํ™•์ธํ•˜์„ธ์š”!

swexpertacademy.com


1. ๋ฌธ์ œ ์š”์•ฝ

๋ณดํ˜ธ ํ•„๋ฆ„์˜ ๋‘๊ป˜D, ๊ฐ€๋กœW, ํ•ฉ๊ฒฉ๊ธฐ์ค€K์™€ ๋ณดํ˜ธ ํ•„๋ฆ„์„ ์ž…๋ ฅ๋ฐ›๋Š”๋‹ค.

๊ฐ ์—ด๋งˆ๋‹ค ๋™์ผํ•œ ํŠน์„ฑ(A๋˜๋Š” B)์ด K๊ฐœ ์ด์ƒ ์—ฐ์†๋  ๊ฒฝ์šฐ ์กฐ๊ฑด์„ ๋งŒ์กฑํ•˜๋ฉฐ,

๊ฐ ํ–‰๋งˆ๋‹ค ๋ชจ๋‘ ๊ฐ™์€ ํŠน์„ฑ์œผ๋กœ ๋ฐ”๊พธ๋Š” '์•ฝํ’ˆ ํˆฌ์ž…'์„ ์‹œํ–‰ํ•  ์ˆ˜ ์žˆ๋‹ค.

์ถœ๋ ฅ์€ ์ด '์•ฝํ’ˆ ํˆฌ์ž…'์˜ ์ตœ์†Œ ํšŸ์ˆ˜๋ฅผ ์ถœ๋ ฅํ•ด์•ผ ํ•œ๋‹ค. ๋”ฐ๋ผ์„œ ์•ฝํ’ˆ ํˆฌ์ž…์„ ํ•˜์ง€ ์•Š๊ณ  ์กฐ๊ฑด์„ ๋งŒ์กฑํ•˜๋Š” ๊ฒฝ์šฐ๋„ ์žˆ๋Š”๋ฐ,

์ด์™€ ๊ฐ™์€ ๊ฒฝ์šฐ๋Š” 0์„ ์ถœ๋ ฅํ•˜๋ฉด ๋œ๋‹ค.

( 3<=D<=13)

2. ํ’€์ด

1์ฐจ - 22.10.17

๋ฐฑํŠธ๋ž˜ํ‚น ๋ฌธ์ œ์ด๋‹ค.

tmp[][] ๋ฐฐ์—ด์„ ๋งŒ๋“ค์–ด์„œ map๊ณผ ๋™์ผํ•œ ๊ฐ’์„ ๋„ฃ์–ด์ฃผ๊ณ , ์—ฌ๊ธฐ์— ์ง์ ‘ A๋ฅผ ๋„ฃ๊ณ  B๋ฅผ ๋„ฃ๊ณ  ์›๋ณตํ•ด์ฃผ๋Š” ๊ฒƒ์„ ๋ฐ˜๋ณตํ•œ๋‹ค.

dfs์—์„œ ๋‹ค์Œ์„ ๋ฐ˜๋ณตํ•œ๋‹ค. ํŒŒ๋ผ๋ฏธํ„ฐ๋กœ ์ƒ‰์น ํ•˜๊ณ  ๊ฐ€๋Š” ํšŸ์ˆ˜์™€ ์ธต์ˆ˜๋ฅผ ๋„˜๊ฒจ์ค€๋‹ค.

1. ์•ฝํ’ˆ ํˆฌ์ž… ์•ˆํ•˜๊ณ  ๊ฐ”์„ ๊ฒฝ์šฐ (์ƒ‰์น  X)

2. ์•ฝํ’ˆ ํˆฌ์ž… A๋กœ ํ•˜๊ณ  ๊ฐ”์„ ๊ฒฝ์šฐ (A๋กœ ์ƒ‰์น )

3. ์•ฝํ’ˆ ํˆฌ์ž… B๋กœ ํ•˜๊ณ  ๊ฐ”์„ ๊ฒฝ์šฐ (B๋กœ ์ƒ‰์น )

4. ๋‹ค ํ•ด๋ดค์œผ๋‹ˆ ์›๋ณต (์ƒ‰์น ํ•œ๊ฑฐ ์›๋ณต)

๊ทธ๋ฆฌ๊ณ  ๊ธฐ์ €์กฐ๊ฑด์—์„œ

D-1์ธต ์ „๋ถ€ ๋‹ค ๋ดค์„ ๊ฒฝ์šฐ, ์กฐ๊ฑด์„ ๋งŒ์กฑํ•˜๋ฉด ํšŸ์ˆ˜ min์„ ๊ฐฑ์‹ ํ•ด์ค€๋‹ค.

์กฐ๊ฑด์€

๊ฐ ์—ด์— ๋Œ€ํ•˜์—ฌ ํ˜„์žฌ ์ธต์˜ ํŠน์„ฑ์ด ์ด์ „ ์ธต์˜ ํŠน์„ฑ๊ณผ ๋™์ผํ•˜๋‹ค๋ฉด cnt๋ฅผ ๋Š˜๋ ค์ฃผ๊ณ ,

๋‹ค๋ฅด๋‹ค๋ฉด cnt=1๋กœ ๋‹ค์‹œ ์ดˆ๊ธฐํ™”ํ•ด์ค€๋‹ค.

cnt==K๊ฐ€ ๋˜๋ฉด flag๋ฅผ true๋กœ ๋ฐ”๊ฟ”์ฃผ๊ณ ,

๋งŒ์•ฝ D-1์ธต๊นŒ์ง€ ๋‹ค ๋ดค์Œ์—๋„ flag๊ฐ€ ์—ฌ์ „ํžˆ false๋ผ๋ฉด, ๊ทธ๊ฒƒ์€ ์กฐ๊ฑด์„ ๋งŒ์กฑํ•˜์ง€ ์•Š๋Š” ๊ฒฝ์šฐ์ด๋ฏ€๋กœ

๋” ๋ณผ ํ•„์š”๊ฐ€ ์—†์œผ๋‹ˆ false๋ฅผ ๋ฆฌํ„ดํ•ด์ค€๋‹ค.

 

----

2์ฐจ - 22.11.15

๋ถ€๋ถ„์ง‘ํ•ฉ(๋ฐฑํŠธ๋ž˜ํ‚น) ๋ฌธ์ œ์ด๋‹ค.

10์‹œ๋ถ€ํ„ฐ ํ’€์–ด์„œ 2์‹œ์— ๋๋‚ฌ๋‹ค. dfs์—๋Š” ๋ฌธ์ œ๊ฐ€ ์—†์—ˆ๊ณ  ์ •๋‹ต ํŒ๋ณ„ํ•˜๋Š” ํ•จ์ˆ˜์—์„œ ๋ฌธ์ œ๊ฐ€ ์žˆ์—ˆ๋‹ค.

๋‚ด๊ฐ€ ๋†“์นœ ๋ถ€๋ถ„์€ K=1์ด ๋  ์ˆ˜ ์žˆ๋‹ค๋Š” ๊ฒƒ์ด์—ˆ๋‹ค.

check() ํ•จ์ˆ˜์—์„œ ์นด์šดํŠธ๋ฅผ 1๋กœ ์ดˆ๊ธฐํ™”ํ•˜๊ณ  ์ด์ „๊ฐ’๊ณผ ํ˜„์žฌ๊ฐ’์ด ๊ฐ™์œผ๋ฉด 1์„ ๋Š˜๋ ค์ค€ ๋‹ค์Œ

cnt๊ฐœ์ˆ˜๊ฐ€ K์™€ ๊ฐ™์€์ง€ ๋ดค๋Š”๋ฐ

์ด๋ ‡๊ฒŒํ•˜๋ฉด ์ด์ „๊ฐ’๊ณผ ํ˜„์žฌ๊ฐ’์ด ๊ฐ™์•„์„œ 2๊ฐ€ ๋˜์—ˆ๋Š”๋ฐ K๋Š” 1์ธ ๊ฒฝ์šฐ๊ฐ€ ๋ฐœ์ƒํ•  ์ˆ˜ ์žˆ๋‹ค.

์ด ๊ฒฝ์šฐ๊ฐ€ ๋ฌด์‹œ๋œ๋‹ค. ๊ทธ๋ž˜์„œ ํ…Œ์ŠคํŠธ์ผ€์ด์Šค 49/50 ๊ฐœ์˜ ์—ฐ์†์ด์—ˆ๋‹ค.

K๊ฐ€ 1์ผ ๋•Œ๋Š” ๋ฌด์กฐ๊ฑด true๋ฅผ ๋ฆฌํ„ดํ•ด์•ผ ํ•œ๋‹ค. ์ด๊ฑธ check()ํ•จ์ˆ˜ ๋งจ ์ฒซ์ค„์— ์ถ”๊ฐ€ํ•˜๋‹ˆ๊นŒ ํ†ต๊ณผํ–ˆ๋‹ค.

 

* ์„ ํƒ์•ˆํ•˜๊ณ  ๊ฐ€๋Š” dfs๋ถ€ํ„ฐ ํ•ด์ฃผ๋Š”๊ฒŒ ๋น ๋ฅด๋‹ค.

์„ ํƒ์•ˆํ•˜๋Š” dfs ๋จผ์ €ํ–ˆ์„ ๋•Œ

์„ ํƒํ•˜๋Š” dfs ๋จผ์ €ํ–ˆ์„ ๋•Œ

 

 

3. ์ฝ”๋“œ

1์ฐจ (์†”๋ฃจ์…˜ ์ฐธ๊ณ ํ•ด์„œ ํ’ˆ) 22.10.17

๋”๋ณด๊ธฐ
import java.io.*;
import java.util.*;

public class SW_2112_๋ณดํ˜ธํ•„๋ฆ„ {

	static int W, D, K, ans;
	static int[][] map, tmp;
	
	public static void main(String[] args) throws Exception {
		BufferedReader br = new BufferedReader(new InputStreamReader(System.in));
		StringTokenizer st = null;
		int T = Integer.parseInt(br.readLine());
		
		for (int tc=1; tc<=T; tc++) {
			st = new StringTokenizer(br.readLine());
			D = Integer.parseInt(st.nextToken());
			W = Integer.parseInt(st.nextToken());
			K = Integer.parseInt(st.nextToken());
			map = new int[D][W];
			tmp = new int[D][W];
			
			for (int i=0; i < D; i++) {
				st = new StringTokenizer(br.readLine());
				for (int j = 0; j<W; j++) {
					int num = Integer.parseInt(st.nextToken());
					map[i][j] = tmp[i][j] = num;
				}
			}
			
			ans = Integer.MAX_VALUE;
			if (check()) ans=0;
			else dfs(0,0);
			System.out.println("#"+tc+" "+ans);
		}
	}
	
	static void dfs(int floor, int cnt) { //cnt:์ค„ ์ƒ‰๊น” ๋ฐ”๊พผ ํšŸ์ˆ˜
		if (cnt >= ans) return;
		
		if (floor == D) {
			if (check()) {
				ans = Math.min(ans, cnt); //์ œ์ผ ์ ๊ฒŒ ๋ฐ”๊ฟ”์ค€ ํšŸ์ˆ˜
			}
			return;
		}
		
		dfs(floor+1, cnt); //์ƒ‰์น  ์•ˆํ•จ
		
		for (int i=0; i < W; i++) {
			tmp[floor][i]=0; //A๋กœ ์ƒ‰์น 
		}
		dfs(floor+1, cnt+1);
		
		for (int i=0; i<W; i++) {
			tmp[floor][i]=1; //B๋กœ ์ƒ‰์น 
		}
		dfs(floor+1, cnt+1);
		
		for (int i=0; i<W; i++) {
			tmp[floor][i] = map[floor][i]; //์›๋ณต
		}
	}
	
	static boolean check() {
		for (int x=0; x<W; x++) {
			boolean isOk = false;
			int cnt=1;
			for (int y=1; y<D; y++) {
				if (tmp[y][x] == tmp[y-1][x]) cnt++;
				else cnt=1;
				if (cnt == K) {
					isOk = true;
					break;
				}
			}
			if (!isOk) return false;
		}
		return true;
	}
}

2์ฐจ (์†”๋ฃจ์…˜ ์•ˆ๋ด„) - 22.11.15

๋”๋ณด๊ธฐ
package a22_11_14;

import java.io.*;
import java.util.*;

public class SW_2112_๋ณดํ˜ธํ•„๋ฆ„ {

	static int D,W,K, ans;
	static int[][] map, cmap;
	
	public static void main(String[] args) throws Exception {
		BufferedReader br = new BufferedReader(new InputStreamReader(System.in));
		StringTokenizer st = null;
		int T = Integer.parseInt(br.readLine());
		
		for (int tc=1; tc<=T; tc++) {
			st = new StringTokenizer(br.readLine());
			D = Integer.parseInt(st.nextToken());
			W = Integer.parseInt(st.nextToken());
			K = Integer.parseInt(st.nextToken());
			map = new int[D][W];
			cmap = new int[D][W];
			
			for (int i=0; i<D; i++) {
				st = new StringTokenizer(br.readLine());
				for (int j=0; j<W; j++) {
					map[i][j] = Integer.parseInt(st.nextToken());
					cmap[i][j] = map[i][j];
				}
			} //์ž…๋ ฅ ๋
			
			ans = Integer.MAX_VALUE;
			subset(0, 0);
			System.out.println("#"+tc+" "+ans);
		}
	}
	
	static void subset(int cnt, int used) {
		if (ans < used) return;
		if (cnt == D) {
			if (check() == true) {
				ans = Math.min(ans, used);
			}
			return;
		}

		subset(cnt+1, used);
		A(cnt);
		subset(cnt+1, used+1);
		B(cnt);
		subset(cnt+1, used+1);
		restore(cnt);
	}
	
	static boolean check() {
		if (K == 1) return true; //๋‚ด๊ฐ€ ๋†“์นœ ๋ถ€๋ถ„ : K๊ฐ€ 1์ด๋  ์ˆ˜ ์žˆ๋‹ค
		
		for (int i=0; i<W; i++) {
			
			boolean isCan = false;
			int cnt = 1;
			int before=cmap[0][i]; //๋งจ ์ฒซ์ค„
			
			for (int j=1; j<D; j++) {
				int now = cmap[j][i];
				if (before==now) {
					cnt++;
					if (cnt==K) {
						isCan = true;
						break;
					}
				} else {
					cnt = 1;
				}
				before = now;
			}
			if (isCan != true) return false;
		}
		return true;
	}
	
	static void A(int cnt) {
		for (int i=0; i<W; i++) {
			cmap[cnt][i] = 0;
		}
	}
	static void B(int cnt) {
		for (int i=0; i<W; i++) {
			cmap[cnt][i] = 1;
		}
	}
	
	static void restore(int cnt) {
		for (int i=0; i<W; i++) {
			cmap[cnt][i] = map[cnt][i];
		}
	}
}

 

4. ์‚ฌ๋‹ด

check()ํ•จ์ˆ˜๊ฐ€ ์˜คํžˆ๋ ค dfs๋ณด๋‹ค ์–ด๋ ค์› ๋˜ ๋ฌธ์ œ์˜€๋‹ค.

์ด์ „์— ์†”๋ฃจ์…˜๋ณด๊ณ  ํ’€์—ˆ๋˜ ๋ฌธ์ œ์ธ๋ฐ ์†”๋ฃจ์…˜ ์—†์ด ๋‹ค์‹œํ’€๋ ค๊ณ  ํ•˜๋‹ˆ๊นŒ ๋ง‰๋ง‰ํ–ˆ๋‹ค.

์•„์ง ๊ฐˆ๊ธธ์ด ๋ฉ€๋‹ค๋Š”๊ฑธ ๋˜ ๊นจ๋‹ซ๋Š”๋‹ค. ๋ถ€์ง€๋Ÿฐํžˆ ํ•˜์ž