최's 먹공로그
BOJ14889_스타트와 링크 본문
https://www.acmicpc.net/problem/14889
문제정리
1. 축구를 하기 위해 모인 사람은 총 N명이고 짝수이다
2. N/2로 나눠서 스타트팀과 링크 팀으로 나눈다
3. 사람에게 번호를 1부터 N까지 배정 후 사람마다 능력치를 부여 한다
4. Sij는 i번 사람과 j번 사람이 같은 팀에 속했을 때 팀에 더해지는 능력치 이다
5. 팀의 능력치는 팀에 속한 모든 쌍의 능력치의 합이다
6. Sij는 Sji와 다를 수 있으며 , i번 사람과 j번 사람이 같은 팀에 속했을 때, 팀에 더해지는
능력치는 Sij + Sji이다
7. 두팀의 능력치의 차이의 최솟값을 출력
문제issue
딱히 없었음
해결흐름
1. 크기가 N인 일차원 배열을 생성해서 1 2 3 4 ... N 까지 배열에 넣는다
2. N/2 개수의 조합을 구성한다
3. 위 조합에서 N/2 Comb 2를 구한다
4. q(DeQue사용)의 양쪽 끝의 차이를 구하면 된다 , q의 처음 팀 : 1,2,3 , q의 마지막 팀 : 4,5,6
이런식으로 q에 저장되기 때문에 양쪽 끝의 차이를 구해서 최솟값을 갱신한다.
소스코드
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 76 77 78 79 80 81 82 83 84 85 86 87 88 89 90 91 92 93 94 95 96 97 | import java.io.BufferedReader; import java.io.IOException; import java.io.InputStreamReader; import java.util.Arrays; import java.util.Deque; import java.util.LinkedList; import java.util.PriorityQueue; import java.util.StringTokenizer; public class Main { private static int N; private static int[][] map; private static int[] arr; private static int[] comb_arr; private static boolean[] arr_visited; private static boolean[] comb_visited; private static int[] comb_arr2; private static int sum; private static Deque<Integer> q; public static void main(String[] args) throws Exception { // input BufferedReader br = new BufferedReader(new InputStreamReader(System.in)); N = Integer.parseInt(br.readLine().trim()); map = new int[N+1][N+1]; arr = new int[N]; arr_visited = new boolean[N]; comb_arr = new int[N/2]; comb_visited = new boolean[N/2]; comb_arr2 = new int[2]; q = new LinkedList<Integer>(); sum = 0; for (int i = 1; i <= N; i++) { StringTokenizer st = new StringTokenizer(br.readLine().trim(), " "); for (int j = 1; j <= N; j++) { map[i][j] = Integer.parseInt(st.nextToken()); } } int number = 1; for (int i = 0; i < N; i++) { arr[i] = number++; } // start comb(0,0); int min = Integer.MAX_VALUE; int cha = 0; while(!q.isEmpty()) { int number1 = q.pop(); int number2 = q.removeLast(); cha = Math.abs(number1 - number2); if(min > cha) min = cha; } System.out.println(min); } // end of main // N Comb N/2를 구하는 comb private static void comb(int len, int t) { if(len == N/2) { sum = 0; comb2(0,0); q.add(sum); return; } for (int i = t; i < arr.length; i++) { if(!arr_visited[i]) { comb_arr[len] = arr[i]; arr_visited[len] = true; comb(len + 1, i + 1); arr_visited[len] = false; } } } // N/2 Comb 2를 구하는 comb2 private static void comb2(int len, int t) { if(len == 2) { solve(); return; } for (int i = t; i < comb_arr.length; i++) { if(!comb_visited[i]) { comb_arr2[len] = comb_arr[i]; comb_visited[len] = true; comb2(len + 1, i + 1); comb_visited[len] = false; } } } private static void solve() { // comb_arr2를 사용 sum += map[comb_arr2[0]][comb_arr2[1]]; sum += map[comb_arr2[1]][comb_arr2[0]]; } } // end of class | cs |
'APS' 카테고리의 다른 글
SEA5658_보물상자 비밀번호 (2) | 2019.07.15 |
---|---|
BOJ14888_연산자끼워넣기 (2) | 2019.07.10 |
BOJ15683_감시 (4) | 2019.06.29 |
BOJ14500_테트로미노 (2) | 2019.06.26 |
BOJ3190_뱀 (1) | 2019.06.26 |