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

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

 

SW Expert Academy

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

swexpertacademy.com


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

NxN ํฌ๊ธฐ์˜ map์—์„œ

1. ์ผ๊พผ 2๋ช…์ด ๊ฐ€๋กœ M ๊ธธ์ด์˜ ๋ฒŒ๊ฟ€์„ ์„ ํƒํ•œ๋‹ค

2. ์„ ํƒํ•œ ๊ฐ๊ฐ์˜ ๊ฟ€์—์„œ ๊ตฌํ•  ์ˆ˜ ์žˆ๋Š” ํ•ฉ์ด C๋ณด๋‹ค ์ž‘์„ ๋•Œ, ์ด ์ˆ˜์ต(๊ฐ๊ฐ ์ œ๊ณฑํ•˜์—ฌ ๋”ํ•จ)์„ ์ถœ๋ ฅํ•œ๋‹ค.

[์ œ์•ฝ์กฐ๊ฑด]

ํ•˜๋‚˜์˜ ๋ฒŒํ†ต์—์„œ ์ผ๋ถ€๋ถ„์˜ ๊ฟ€๋งŒ ์ฑ„์ทจํ•  ์ˆ˜ ์—†๋‹ค. ์ฆ‰, ํ•œ ์นธ์— ๋“ค์–ด์žˆ๋Š” ์ˆซ์ž๊ฐ€ 9๋ฉด 9๋ฅผ ๊ทธ๋Œ€๋กœ ๋”ํ•ด์•ผ ํ•œ๋‹ค.

 

2. ํ’€์ด

์กฐํ•ฉ + ๋ถ€๋ถ„์ง‘ํ•ฉ ๋ฌธ์ œ์ด๋‹ค.

1. ์ผ๊พผ 2๋ช…์ด ๋ฒŒ๊ฟ€์„ ์„ ํƒํ•  ๋•Œ ์กฐํ•ฉ์„ ์‚ฌ์šฉํ–ˆ๋‹ค.

 - N=4๋ผ๋ฉด 0~15๊นŒ์ง€์˜ ์ˆซ์ž ์ค‘ ๊ฐ๊ฐ ํ•˜๋‚˜๋ฅผ ์„ ํƒํ•œ๋‹ค. ์„ ํƒํ•œ ๋‘ ์ˆซ์ž๋Š” tgt[ ] ์•ˆ์— ๋‹ด์•„์ค€๋‹ค.

 - ๊ธฐ์ €์กฐ๊ฑด์—์„œ,

     => ์„ ํƒํ•œ ์ˆซ์ž์˜ y์ขŒํ‘œ์™€ ๊ฐ€๋กœM๊ธธ์ด ๋(์„ ํƒํ•œ ์ˆซ์ž+M-1)์˜ y์ขŒํ‘œ๊ฐ€ ์„œ๋กœ ๋‹ค๋ฅด๋ฉด returnํ•œ๋‹ค.

           (์ฒซ ๋ฒˆ์งธ, ๋‘ ๋ฒˆ์งธ ๋‘˜ ๋‹ค)

     => ์ฒซ ๋ฒˆ์งธ ์„ ํƒํ•œ ์ˆซ์ž์˜ ๊ฐ€๋กœ M๊ธธ์ด ๋ ์ˆซ์ž(์„ ํƒํ•œ ์ˆซ์ž+M-1)๊ฐ€ ๋‘ ๋ฒˆ์งธ ์„ ํƒํ•œ ์ˆซ์ž๋ณด๋‹ค ํฌ๊ฑฐ๋‚˜ ๊ฐ™์œผ๋ฉด returnํ•œ๋‹ค.

2. ์ผ๊พผ 2๋ช…์˜ ๋ฒŒ๊ฟ€์„ ๊ฐ๊ฐ ์„ ํƒํ–ˆ์œผ๋‹ˆ, ์ด์ œ ์ตœ๋Œ€ ํ•ฉ์„ ๊ตฌํ•˜๋Ÿฌ ๊ฐ„๋‹ค. ์ตœ๋Œ€ํ•ฉ์€ ๊ฐœ์ˆ˜๋งˆ๋‹ค ๋ชจ๋“  ์กฐํ•ฉ์„ ๋ณด๊ณ  ์ตœ๋Œ“๊ฐ’์„ ๊ฐฑ์‹ ํ•˜์˜€๊ธฐ ๋•Œ๋ฌธ์—, ๋ถ€๋ถ„์ง‘ํ•ฉ์„ ์‚ฌ์šฉํ–ˆ๋‹ค.

 - ์ผ๊พผ1, ์ผ๊พผ2 ๊ฐ๊ฐ ๋ถ€๋ถ„์ง‘ํ•ฉ์„ ๋Œ๋ ค์ฃผ์—ˆ๊ณ  ๋ถ€๋ถ„์ง‘ํ•ฉ์ด ๋๋‚˜๊ณ  ๋‚˜์˜จ ์ตœ๋Œ€ํ•ฉ์„ ์„œ๋กœ ๋”ํ•ด์ฃผ์—ˆ๋‹ค.

 - ์ด๊ฒƒ์„ ๋ชจ๋“  ์กฐํ•ฉ์— ๋Œ€ํ•ด ๋˜ ์ตœ๋Œ“๊ฐ’์„ ๊ฐฑ์‹ ํ•ด์ฃผ์—ˆ๋‹ค.

* ๋ถ€๋ถ„์ง‘ํ•ฉ์˜ ๊ธฐ์ €์กฐ๊ฑด์œผ๋กœ ํ•ฉ์ด C๋ณด๋‹ค ํด ๊ฒฝ์šฐ, return ํ•œ๋‹ค.

 

3. ์ฝ”๋“œ

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

public class SW_2115_๋ฒŒ๊ฟ€์ฑ„์ทจ {

	static int[][] map;
	static int N, M, C, ans, honeyMax0, honeyMax1;
	static int[] tgt;
	static boolean[] isSelected;
	
	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());
			N = Integer.parseInt(st.nextToken());
			M = Integer.parseInt(st.nextToken());
			C = Integer.parseInt(st.nextToken());
			map = new int[N][N];
			tgt = new int[2];
			
			for (int i=0; i<N; i++) {
				st = new StringTokenizer(br.readLine());
				for (int j=0; j<N; j++) {
					map[i][j] = Integer.parseInt(st.nextToken());
				}
			}// ์ž…๋ ฅ ๋
			
			ans=0;
			comb(0,0);
			System.out.println("#"+tc+" "+ans);
		}
	}
	
	static void comb(int tgtIdx, int srcIdx) {
		if (srcIdx==N*N) return;
		if (tgtIdx==2) {
			
			if ( tgt[0]+M-1 >= tgt[1] ) return;
			if ( ( tgt[0]/N != (tgt[0]+M-1)/N ) || ( tgt[1]/N != (tgt[1]+M-1)/N ) ) return;
			
			int res = getMaxHoney();
			ans = Math.max(ans, res);
			
			return;
		}
		tgt[tgtIdx] = srcIdx;
		comb(tgtIdx+1, srcIdx+1);
		comb(tgtIdx, srcIdx+1);
	}
	
	static int getMaxHoney() {
		honeyMax0 = 0;
		isSelected = new boolean[N*N];
		subset(0, tgt[0], tgt[0]+M, 0, 0);
		honeyMax1 = 0;
		isSelected = new boolean[N*N];
		subset(1, tgt[1], tgt[1]+M, 0, 0);
		
		return honeyMax0 + honeyMax1;
	}
	
	static void subset(int mode, int idx, int end, int sum, int powSum) {
		if (sum > C) return;
		if (idx == end) {
			if (mode==0) {
				honeyMax0 = Math.max(honeyMax0, powSum);
			} else if (mode == 1) {
				honeyMax1 = Math.max(honeyMax1, powSum);
			}
			return;
		}
		
		int y = idx/N;
		int x = idx%N;
		
		isSelected[idx] = true;
		subset(mode, idx+1, end, sum+map[y][x], powSum+map[y][x]*map[y][x]);
		isSelected[idx] = false;
		subset(mode, idx+1, end, sum, powSum);
		
	}
}