Notice
Recent Posts
Recent Comments
Link
일 | 월 | 화 | 수 | 목 | 금 | 토 |
---|---|---|---|---|---|---|
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 |
Tags
- 디베이스앤
- oracle ansi sql
- 프로그래머스 이중우선순위큐 java
- BFS
- JPA
- IT 면접 준비
- SQL
- CJ DBASE&
- 디베이스앤 인턴 후기
- 면접 필수 질문
- 백트래킹
- 그리디
- Java
- 위상정렬
- 프로그래머스
- 이중우선순위큐 java
- DBASE&
- 개발자 면접 준비
- ansi sql 단점
- ansi sql 장점
- DP
- 이중우선순위큐 자바
- Gradle
- DFS
- 프로그래머스 이중우선순위큐 자바
- 이분탐색
- 백준
- 프로그래머스 이중우선순위큐
- oracle ansi
- Spring Boot
Archives
- Today
- Total
쉬운 프로그래밍
[알고리즘] 백준 14889 스타트와 링크 - JAVA 본문
총원 4명이 축구를 한다고 예를 들면 (1, 2), (3,4)와 같이 팀 순서쌍을 어떤 방식으로 만드냐가 문제를 푸는데 핵심문제이다.
visited[] boolean 배열을 만들어서 true인 인덱스끼리 한 팀, false인 인덱스끼리 한 팀이라는 아이디어로 문제를 해결하였다.
백트래킹 방식을 적용하여 모든 경우에 대한 순서쌍을 만들었다.
코드 설명은 주석에 자세히 써놓았다.
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 BOJ_14889 {
static int n;
static int[][] map;
static boolean[] visited;
static int diffTeamStat = Integer.MAX_VALUE;
public static void main(String[] args) throws IOException {
// input
BufferedReader br = new BufferedReader(new InputStreamReader(System.in));
String s = br.readLine();
n = Integer.parseInt(s);
map = new int[n + 1][n + 1];
visited = new boolean[n + 1];
for (int i = 1; i < n + 1; i++) {
s = br.readLine();
StringTokenizer st = new StringTokenizer(s, " ");
for (int j = 1; j < n + 1; j++) {
map[i][j] = Integer.parseInt(st.nextToken());
}
}
// input end
backTracking(0, 1);
System.out.println(diffTeamStat);
}
static void backTracking(int d, int index) {
// depth가 n / 2가 되면 팀 순서쌍을 만든 것으로 판단
// 이 시점의 팀스탯을 계산하고 return한다.
if (d == n / 2) {
teamStat();
return;
}
// visited[]를 통해 재귀적으로 팀 순서쌍을 만들어준다.
// 1,2 = 2,1 이기 때문에 반복문을 index부터 시작해서 돌려준다.
// visited[]가 같은 값인 것들이 한 팀을 이룬다.
for (int i = index; i < n + 1; i++) {
if (!visited[i]) {
visited[i] = true;
backTracking(d + 1, i + 1);
visited[i] = false;
}
}
}
static void teamStat() {
List<Integer> startTeam = new ArrayList<Integer>(); // start 팀 순서쌍
List<Integer> linkTeam = new ArrayList<Integer>(); // linkTeam 순서쌍
for (int i = 1; i < n + 1; i++) {
if (visited[i]) {
startTeam.add(i);
} else {
linkTeam.add(i);
}
}
int startTeamStat = 0;
int linkTeamStat = 0;
// map[i][j] + map[j][i] 계산
for (int i = 0; i < startTeam.size(); i++) {
for (int j = i + 1; j < startTeam.size(); j++) {
startTeamStat += map[startTeam.get(i)][startTeam.get(j)];
startTeamStat += map[startTeam.get(j)][startTeam.get(i)];
linkTeamStat += map[linkTeam.get(i)][linkTeam.get(j)];
linkTeamStat += map[linkTeam.get(j)][linkTeam.get(i)];
}
}
diffTeamStat = Math.min(Math.abs(startTeamStat - linkTeamStat), diffTeamStat);
}
}
'알고리즘 > 백트래킹' 카테고리의 다른 글
[알고리즘] 프로그래머스 - 여행경로 - JAVA (2) | 2021.08.13 |
---|---|
[알고리즘] 프로그래머스 - 단어 변환 - JAVA (0) | 2021.08.12 |
[알고리즘] 백준 14888 연산자 끼워넣기 - JAVA (0) | 2021.02.05 |
[알고리즘] 백준 2580 스도쿠 - JAVA (0) | 2021.02.04 |
[알고리즘] 백준 9663 N-Queen (8) | 2021.01.10 |
Comments