본문 바로가기

Java/백준

[JAVA] 백준 14889 스타트와 링크

14889번: 스타트와 링크 (acmicpc.net)

 

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