본문 바로가기
알고리즘/백준

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

by 박 현 황 2021. 3. 17.

문제링크

https://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

 

 

import java.io.BufferedReader;
import java.io.IOException;
import java.io.InputStreamReader;
import java.util.StringTokenizer;

public class Main {
	static int N;
	static int map[][];
	static boolean isVisited[];
	static int result = Integer.MAX_VALUE;
	public static void main(String[] args) throws NumberFormatException, IOException {
		BufferedReader br = new BufferedReader(new InputStreamReader(System.in));
		StringTokenizer st;
		N = Integer.parseInt(br.readLine());
		
		map = new int[N][N];
		isVisited = new boolean[N];
		
		for(int i=0;i<N;i++) {
			st = new StringTokenizer(br.readLine());
			for(int j=0;j<N;j++) map[i][j] = Integer.parseInt(st.nextToken());
		}
		
		//무조건 N/2명?
		dfs(0,0);
		System.out.println(result);
	}
	
	static void dfs(int idx,int cnt) {
		if(result == 0) return;
		if(cnt == (N/2)) { //계산
			calc();
			return;
		}
		
		for(int i=idx;i<N;i++) {
			if(!isVisited[i]) {
				isVisited[i] = true;
				dfs(i,cnt+1);
				isVisited[i] = false;
			}
			
		}
		
		
	}
	
	static void calc() {
		int start[] = new int[N/2];
		int link [] = new int[N/2];
		int start_idx=0;
		int link_idx=0;
		int start_sum=0;
		int link_sum = 0;
		
		for(int i=0;i<N;i++) {
			if(isVisited[i]) start[start_idx++] = i;
			else link[link_idx++] =i;
		}
		
		for(int i=0;i<N/2;i++) {
			for(int j=i+1;j<N/2;j++) {
				if(i == j) continue;
				
				int start_x = start[i];
				int start_y = start[j];
				
				start_sum +=( map[start_x][start_y] + map[start_y][start_x]);
				
				start_x = link[i];
				start_y = link[j];
				
				link_sum +=(map[start_x][start_y]+map[start_y][start_x]);
			}
		}
		
		result = Math.min(result, Math.abs(start_sum-link_sum));
	}
}

 

 

시간 초과 나서 고생했다.

 

일단 DFS로 풀었다.

isVisited이용해서 방문하고 안하고를 체크해주어 N/2가 되면 계산을 해주었다.

 

시간초과가 발생한 이유는 dfs를 돌릴 떄 for문을 idx로 시작안하고 0으로 시작했더니 시간초과가 발생하더라.

그리고 혹시 몰라서 result = 0이 되면 이게 제일 최소값이니까 그 이후에는 계산 안하고 return 하도록 만들어주었다.

'알고리즘 > 백준' 카테고리의 다른 글

[JAVA]백준_16562_친구비  (0) 2021.03.19
[JAVA]백준_1717_집합의표현  (0) 2021.03.19
[JAVA]3709_레이저빔은 어디로  (0) 2021.03.17
[JAVA]백준_1260_DFS와 BFS  (0) 2021.03.16
[JAVA]백준_7569_토마토  (0) 2021.03.15