<๋ฌธ์ ๋งํฌ>
https://swexpertacademy.com/main/code/problem/problemDetail.do?contestProbId=AV4suNtaXFEDFAUf
SW Expert Academy
SW ํ๋ก๊ทธ๋๋ฐ ์ญ๋ ๊ฐํ์ ๋์์ด ๋๋ ๋ค์ํ ํ์ต ์ปจํ ์ธ ๋ฅผ ํ์ธํ์ธ์!
swexpertacademy.com
<ํ์ด ์ ๋ต>
1. ๋ฌธ์ ์ ์ ์๋ N์ ๊ฐ์์ ํ๋ก์ธ์ ์ต๋ ๊ฐ์๊ฐ 12๋ก ์์ ํธ์ด๊ธฐ์ ์์ ํ์์ผ๋ก ์ถฉ๋ถํ ํ ์ ์๋ค.
2. ํด๋น ํ๋ก์ธ์์ ์ฐ๊ฒฐ ๊ฐ๋ฅ ์ฌ๋ถ๋ฅผ ๊ฒ์ฆํ๋ ํจ์๋ฅผ ๋ง๋ค๊ณ ๋ฐฑํธ๋ํน์ผ๋ก ๋ชจ๋ ํ๋ก์ธ์๋ฅผ ์ ํ/๋น์ ํํ๋ฉด์ 4๋ฐฉํฅ์ผ๋ก ์ฐ๊ฒฐ ๊ฐ๋ฅ ์ฌ๋ถ๋ฅผ ๊ฒ์ฆํ๋ค.
<์ ๋ต ์ฝ๋>
import java.io.BufferedReader;
import java.io.IOException;
import java.io.InputStreamReader;
import java.util.ArrayList;
import java.util.List;
import java.util.StringTokenizer;
public class Solution {
// ์
์ถ๋ ฅ
static BufferedReader br = new BufferedReader(new InputStreamReader(System.in));
static StringBuilder sb = new StringBuilder();
static StringTokenizer st;
// ๋ณ์
private static int T, N, totalCore, maxCore, minCable;
private static int[][] arr;
private static int[] dr = {-1, 1, 0, 0};
private static int[] dc = {0, 0, -1, 1};
private static List<Core> coreList;
// ์ฝ์ด
private static class Core {
int r, c;
public Core(int r, int c) {
this.r = r;
this.c = c;
}
}
// ์ฐ๊ฒฐ ๊ฐ๋ฅ์ฌ๋ถ
private static boolean isAvailable(Core core, int d){
int nr = core.r;
int nc = core.c;
// ํ๋ก์ธ์์์ ์์
while (true) {
nr += dr[d];
nc += dc[d];
// ์ฐ๊ฒฐ ์ฑ๊ณต
if (nr < 0 || nc < 0 || nr >= N || nc >= N) {
return true;
}
// ์ฐ๊ฒฐ ์คํจ
if (arr[nr][nc] >= 1){
return false;
}
}
}
// ์ ์ ์ค์น
private static int setCable(Core core, int d, int k) {
int nr = core.r;
int nc = core.c;
int cnt = 0;
while (true) {
nr += dr[d];
nc += dc[d];
if (nr < 0 || nc < 0 || nr >= N || nc >= N) {
return cnt;
}
arr[nr][nc] = k;
cnt ++;
}
}
// ๋ฐฑํธ๋ํน
private static void backTracking(int depth, int coreCnt, int cableLen) {
// ๊ฐ์ง์น๊ธฐ
if (totalCore - depth + coreCnt <maxCore) {
return;
}
// ๋ฐํ์กฐ๊ฑด
if (depth == totalCore) {
// ์ฝ์ด, ์ผ์ด๋ธ ๊ฐฑ์
if (coreCnt > maxCore) {
maxCore = coreCnt;
minCable = cableLen;
}
// ์ผ์ด๋ธ ๊ฐฑ์
else if (coreCnt == maxCore) {
minCable = Math.min(cableLen, minCable);
}
return;
}
// ์ฝ์ด ๊ฐ์ ธ์ค๊ธฐ
Core curr = coreList.get(depth);
// ์ฐ๊ฒฐ o
for (int d = 0; d < 4; d++) {
// ํด๋น ๋ฐฉํฅ์ผ๋ก ์ฐ๊ฒฐ์ด ๊ฐ๋ฅํ ๊ฒฝ์ฐ
if (isAvailable(curr, d)){
// ์ ์ ์ค์น
int cnt = setCable(curr, d, 2);
// ์ฌ๊ท์ ์ผ๋ก ํ์
backTracking(depth + 1, coreCnt + 1, cableLen + cnt);
// ๋ฐฑํธ๋ํน
setCable(curr, d, 0);
}
}
// ์ฐ๊ฒฐ x
backTracking(depth + 1, coreCnt, cableLen);
}
public static void main (String[] args) throws IOException {
// ํ
์คํธ ์ผ์ด์ค
T = Integer.parseInt(br.readLine());
for (int t = 1; t <= T; t++) {
// ๋ณ์ ์ด๊ธฐํ
N = Integer.parseInt(br.readLine());
arr = new int[N][N];
coreList = new ArrayList<>();
totalCore = 0;
for (int r = 0; r < N; r++) {
st = new StringTokenizer(br.readLine());
for (int c = 0; c < N; c++) {
// ํ๋ก์ธ์ ๋ฐ ์ฝ์ด ์
๋ ฅ
arr[r][c] = Integer.parseInt(st.nextToken());
if (arr[r][c] == 1) {
coreList.add(new Core(r, c));
}
}
}
// ๋ณ์ ์ด๊ธฐํ
maxCore = 0;
minCable = Integer.MAX_VALUE;
totalCore = coreList.size();
// ๋ฐฑํธ๋ํน
backTracking(0, 0, 0);
sb.append("#" + t + " " + minCable + "\n");
}
System.out.println(sb.toString());
}
}
'โญ Problem_Solving > SWEA' ์นดํ ๊ณ ๋ฆฌ์ ๋ค๋ฅธ ๊ธ
[SWEA] 1868. ํํํํ ์ง๋ขฐ์ฐพ๊ธฐ (Java / ์๋ฐ) (0) | 2023.02.15 |
---|
๋๊ธ