14889번: 스타트와 링크
예제 2의 경우에 (1, 3, 6), (2, 4, 5)로 팀을 나누면 되고, 예제 3의 경우에는 (1, 2, 4, 5), (3, 6, 7, 8)로 팀을 나누면 된다.
www.acmicpc.net
- n/2명으로 이루어진 스타트 팀과 링크 팀으로 사람들을 나눠야 함
- Sij는 i번 사람과 j번 사람이 같은 팀에 속했을 때, 팀에 더해진느 능력
- 팀의 능력치는 팀에 속한 모든 쌍의 능력치 Sij의 합
- Sij와 Sji는 다를 수도 있으며 i번 사람과 j번 사람이 같은 팀에 속했을 때, 팀에 더해지는 능력치는 Sij와 Sji이다
- 스타트 팀의 능력치와 링크 팀의 능력치 차이를 최소로 하려고 함
문제 풀이
[백준/BOJ] 14889번 스타트와 링크 (C/C++) (tistory.com)
[백준/BOJ] 14889번 스타트와 링크 (C/C++)
백준 온라인 저지(BOJ) 14889번 스타트와 링크 https://www.acmicpc.net/problem/14889 14889번: 스타트와 링크 예제 2의 경우에 (1, 3, 6), (2, 4, 5)로 팀을 나누면 되고, 예제 3의 경우에는 (1, 2, 4, 5), (3, 6, 7, 8)로 팀
rightbellboy.tistory.com
[백준] 14889번 스타트와 링크 - Java, 자바 (velog.io)
[백준] 14889번 스타트와 링크 - Java, 자바
실버 2https://www.acmicpc.net/problem/14889 백트래킹으로 문제를 해결했다. 팀조합을 만든다 (한 팀의 인원수는 n/2)for문을 실행해 방문하지 않은 팀원이면 방문하고 백트래킹 수행 재귀가 끝나면 비방문
velog.io
- dfs를 활용하여 depth가 n/2가 될 때까지 한 팀으로 구성
- 모든 조합의 경우의 수를 탐색하여 두 팀의 능력치가 최소가 되는 수를 찾고 이를 출력하면 됨
- 뽑힌 선수를 visited[ ]배열에 저장 (노드의 방문 여부 확인)
- 한 분기가 끝에 도달했을 떄 visited[ ] 내의 true값인 인덱스는 스타트 팀, false값인 인덱스는 링크팀
정답
import java.io.BufferedReader;
import java.io.InputStreamReader;
import java.io.IOException;
import java.util.StringTokenizer;
public class Main {
static int n;
static int score[][];
static boolean visited[];
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());
score = new int[n][n];
visited = new boolean[n];
for(int i=0; i<n; i++)
{
StringTokenizer st = new StringTokenizer(br.readLine());
for(int j=0; j<n; j++)
{
score[i][j] = Integer.parseInt(st.nextToken());
}
}
dfs(0,0);
System.out.println(min);
}
static void dfs(int idx, int depth)
{
if(depth == n/2)
{
diff();
return;
}
for(int i=idx; i<n; i++)
{
if(!visited[i])
{
visited[i] = true; //방문으로 변경
dfs(i+1,depth+1); //재귀 호출
visited[i] = false; //재귀가 끝나면 비방문으로 변경
}
}
}
static void diff()
{
int start = 0;
int link = 0;
for(int i=0; i<n-1; i++)
{
for(int j=i+1; j<n; j++)
{
if(visited[i] == true && visited[j] == true)
{
start +=score[i][j];
start +=score[j][i];
}
else if(visited[i]==false && visited[j]==false)
{
link +=score[i][j];
link +=score[j][i];
}
}
}
int result = Math.abs(start-link);
if(result ==0)
{
System.out.println(result);
System.exit(0);
}
min = Math.min(result,min);
}
}
'Java > 백준' 카테고리의 다른 글
[JAVA] 백준 1904 01타일 (0) | 2024.02.26 |
---|---|
[JAVA] 백준 9184 신나는 함수 실행 (0) | 2024.02.26 |
[JAVA] 백준 2580 스도쿠 (0) | 2024.02.23 |
[JAVA] 백준 9663 N-Queen (0) | 2024.02.23 |
[JAVA] 백준 11729 하노이 탑 이동 순서 (0) | 2024.02.20 |