🔺 문제
14889번: 스타트와 링크
예제 2의 경우에 (1, 3, 6), (2, 4, 5)로 팀을 나누면 되고, 예제 3의 경우에는 (1, 2, 4, 5), (3, 6, 7, 8)로 팀을 나누면 된다.
www.acmicpc.net
🔺 코드
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
|
import java.util.*;
import java.io.*;
public class Main {
static int N;
static int[][] map;
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());
map = 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++) {
map[i][j] = Integer.parseInt(st.nextToken());
}
}
combi(0, 0);
System.out.println(min);
}
private static void combi(int idx, int depth) {
if(depth == N / 2) {
diff();
return;
}
for(int i = idx ; i < N ; i++) { // 팀 나누기
if(!visited[i]) {
visited[i] = true;
combi(i + 1, depth + 1); // 재귀 호출
visited[i] = false; // 다른 조합 구성할 수 있게 원상복구
}
}
}
/*** 두 팀 (방문한 팀 vs 방문 안 한 팀) 능력치 차이 계산 메소드 ***/
private static void diff() {
int teamS = 0;
int teamL = 0;
for(int i = 0 ; i < N - 1 ; i++) {
for(int j = i + 1 ; j < N ; j++) {
// 스타트 팀 (= 방문한 팀) 점수 더하기
if(visited[i] && visited[j]) {
teamS += map[i][j];
teamS += map[j][i];
}
// 링크 팀 (= 방문 안 한 팀) 점수 더하기
else if(!visited[i] && !visited[j]) {
teamL += map[i][j];
teamL += map[j][i];
}
}
}
// 두 팀 점수 차이
int diff = Math.abs(teamS - teamL);
if(diff == 0) {
System.out.println(0);
System.exit(0); // 프로그램 종료
}
min = Math.min(min, diff);
}
}
|
cs |
✅ 해결 아이디어
✔ 백트래킹
- 숫자를 N / 2개 뽑으면 두 팀 간 점수 차이 구하기
- 뽑은 숫자들에 대해 "순열"로 각 팀 능력치 계산 (diff 메소드)
└ 스타트 팀 : visited[i] == true && visited[j] == true 인 팀
└ 링크 팀 : visited[i] == false && visited[j] == false인 팀
💥 유의사항
• 70번째 줄에 System.exit(0)
해야 0 출력하고 프로그램이 제대로 종료됨. 안 그러면 재귀 뒤쪽까지 돌아서 틀림
• 방문 배열을 잊지 말고 잘 사용하자..
🔺 다른 풀이들
[백준] 14889번 스타트와 링크 - Java, 자바
실버 2https://www.acmicpc.net/problem/14889 백트래킹으로 문제를 해결했다. 팀조합을 만든다 (한 팀의 인원수는 n/2)for문을 실행해 방문하지 않은 팀원이면 방문하고 백트래킹 수행 재귀가 끝나면 비방문
velog.io
💬 느낀 점
백트래킹 감은 잡았는데 아직까지는 놓치는 부분이 있어서 풀이 참고를 해야하는 것 같다....
후하 정복해주겠다....,,,ㅠ
1회독 | 2회독 | 3회독 | 4회독 | 5회독 |
V |
(참고)
✔ 풀이 항상 감사드리는 선생님들..🥺🥺
[백준] 14889번 : 스타트와 링크 - JAVA [자바]
www.acmicpc.net/problem/14889 14889번: 스타트와 링크 예제 2의 경우에 (1, 3, 6), (2, 4, 5)로 팀을 나누면 되고, 예제 3의 경우에는 (1, 2, 4, 5), (3, 6, 7, 8)로 팀을 나누면 된다. www.acmicpc.net 문제 저번 연산자 끼
st-lab.tistory.com
[백준][JAVA알고리즘]14889번 풀이(스타트와 링크) - 초보도 이해하는 풀이
안녕하세요 인포돈 입니다. 백준 알고리즘 14889번 풀이입니다. * 참고사항 - 개발환경은 eclipse을 기준으로 작성되었습니다. - java언어를 이용하여 문제를 풀이합니다. - 알고리즘 문제는 풀이를
infodon.tistory.com
[백준] 14889번 - "스타트와 링크" (Java)
www.acmicpc.net/problem/14889 14889번: 스타트와 링크 예제 2의 경우에 (1, 3, 6), (2, 4, 5)로 팀을 나누면 되고, 예제 3의 경우에는 (1, 2, 4, 5), (3, 6, 7, 8)로 팀을 나누면 된다. www.acmicpc.net 난이도 : 실버3 브루트
bbangson.tistory.com
'코테 > 백준' 카테고리의 다른 글
[백준/JAVA] 15657번: N과 M (8) (0) | 2023.08.25 |
---|---|
[백준/JAVA] 10971번: 외판원 순회 2 (0) | 2023.08.24 |
[백준/JAVA] 11052번: 카드 구매하기 (0) | 2023.08.23 |
[백준/JAVA] 1459번: 걷기 (0) | 2023.08.23 |
[백준/JAVA] 9663번: N-Queen (0) | 2023.08.22 |