Notice
Recent Posts
Recent Comments
Link
변수의 기록
(코테) 백준_15661_링크와 스타트 *백트레킹 , 비트마스킹 + 브루트포스 코드 본문
풀이 * 백트레킹
package test;
import java.util.*;
import java.io.*;
public class Backjun_15661_test {
static int N;
static int[][] list;
static boolean[] visted ;
static int min = Integer.MAX_VALUE;
public static void main(String[] args) throws IOException {
// 기본 값들 세팅
BufferedReader br = new BufferedReader(new InputStreamReader(System.in));
N = Integer.parseInt(br.readLine());
visted = new boolean[N];
list = new int[N][N];
StringTokenizer st ;
for(int i=0;i<N;i++) {
st = new StringTokenizer(br.readLine());
for(int x=0;x<N;x++) {
list[i][x] = Integer.parseInt(st.nextToken());
}
}
// 실행문
dfs(0);
System.out.print(min);
}
public static void dfs(int deep) {
List<Integer> teamA = new ArrayList<>();
List<Integer> teamB = new ArrayList<>();
if(deep==N) {
//팀 세팅부터
for(int i=0;i<N;i++) {
if(visted[i]) teamA.add(i);
else teamB.add(i);
}
if(teamA.size()<2 || teamB.size()<2) return;
int a = ableChk(teamA);
int b = ableChk(teamB);
//값 비교 + 값 갱신
min = Math.min(min, Math.abs(a-b));
return;
}
//dfs 백트레킹 조건은 팀 세팅?? true로
visted[deep] = true;
dfs(deep+1);
visted[deep] = false;
dfs(deep+1);
}
public static int ableChk(List<Integer> team) {
int sum = 0;
//14678
for(int i =0;i<team.size();i++) {
for(int x =i+1;x<team.size();x++) {
int a =team.get(i);
int b =team.get(x);
sum += list[a][b] + list[b][a];
}
}
return sum;
}
}
풀이 2 비트마스킹 + 브루트포스 코드
import java.util.*;
import java.io.*;
public class Main {
static int N;
static int[][] S;
static int min = Integer.MAX_VALUE;
public static void main(String[] args) throws IOException {
BufferedReader br = new BufferedReader(new InputStreamReader(System.in));
N = Integer.parseInt(br.readLine());
S = new int[N][N];
for (int i = 0; i < N; i++) {
StringTokenizer st = new StringTokenizer(br.readLine());
for (int j = 0; j < N; j++) {
S[i][j] = Integer.parseInt(st.nextToken());
}
}
int total = 1 << N; // 2^N
for (int mask = 1; mask < total - 1; mask++) { // 0과 2^N -1은 전체 or 공집합이므로 제외
List<Integer> teamA = new ArrayList<>();
List<Integer> teamB = new ArrayList<>();
for (int i = 0; i < N; i++) {
if ((mask & (1 << i)) != 0) teamA.add(i);
else teamB.add(i);
}
if (teamA.size() == 0 || teamB.size() == 0) continue;
int scoreA = getScore(teamA);
int scoreB = getScore(teamB);
min = Math.min(min, Math.abs(scoreA - scoreB));
}
System.out.println(min);
}
static int getScore(List<Integer> team) {
int sum = 0;
for (int i = 0; i < team.size(); i++) {
for (int j = i + 1; j < team.size(); j++) {
int a = team.get(i);
int b = team.get(j);
sum += S[a][b] + S[b][a];
}
}
return sum;
}
}
'기타 > 코딩테스트' 카테고리의 다른 글
(코테) 백준_2512_예산 *이분 탐색 (Binary Search) (0) | 2025.05.28 |
---|---|
(코테) 백준_1654_랜선 자르기 *이분 탐색 (0) | 2025.05.27 |
(코테) 백준_유형별 풀이 파악하는 팁 (0) | 2025.05.24 |
(코테) 백준_1697_숨박꼭질 BFS (0) | 2025.05.24 |
(코딩테스트) 백준_11053_가장 긴 증가하는 부분 수열 / DP (0) | 2025.05.24 |