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);
}
}
'Algorithm > SWEA' ์นดํ ๊ณ ๋ฆฌ์ ๋ค๋ฅธ ๊ธ
[SWEA] 1227. [S/W ๋ฌธ์ ํด๊ฒฐ ๊ธฐ๋ณธ] 7์ผ์ฐจ - ๋ฏธ๋ก2 - Java (0) | 2022.10.27 |
---|---|
[SWEA] 14510. ๋๋ฌด ๋์ด - Java (0) | 2022.10.26 |
[SWEA] 5650. [๋ชจ์ SW ์ญ๋ํ ์คํธ] ํ๋ณผ ๊ฒ์ Java (0) | 2022.10.22 |
[SWEA] 2112. [๋ชจ์ SW ์ญ๋ํ ์คํธ] ๋ณดํธ ํ๋ฆ - Java (0) | 2022.10.18 |
[SWEA] 2383. [๋ชจ์ SW ์ญ๋ํ ์คํธ] ์ ์ฌ ์์ฌ์๊ฐ Java (0) | 2022.10.02 |