-
[java] 백준 14889 : 스타트와 링크알고리즘 2023. 8. 31. 21:30
https://www.acmicpc.net/problem/14889
시간초과
import java.io.BufferedReader; import java.io.BufferedWriter; import java.io.IOException; import java.io.InputStreamReader; import java.io.OutputStreamWriter; import java.util.*; public class Main { static int[][] arr; static int n; static int min = Integer.MAX_VALUE; static boolean[] visited; public static void main(String[] args) throws IOException { Scanner sc = new Scanner(System.in); n = sc.nextInt(); arr = new int[n][n]; visited = new boolean[n]; for(int i=0; i<n; i++) { for(int j=0; j<n; j++) { arr[i][j] = sc.nextInt(); } } combi(0); System.out.println(min); } static void combi(int count) { if(count == n/2) { diff(); return; } for(int i=0; i<n; i++) { if(!visited[i]) { visited[i]= true; combi(count+1); visited[i]= false; } } } static void diff() { int startTeam = 0; int linkTeam = 0; for(int i=0; i<n-1; i++) { for(int j=i+1; j<n; j++) { if(visited[i]==true && visited[j]==true) { startTeam += arr[i][j]; startTeam += arr[j][i]; } else if(visited[i]==false && visited[j]==false) { linkTeam += arr[i][j]; linkTeam += arr[j][i]; } } } int diff = Math.abs(startTeam - linkTeam); if(diff ==0) { System.out.println(0); System.exit(0); } min = Math.min(min, diff); } }
반복문에 인덱스부터 반복문을 돌게 수정
import java.io.BufferedReader; import java.io.BufferedWriter; import java.io.IOException; import java.io.InputStreamReader; import java.io.OutputStreamWriter; import java.util.*; public class Main { static int[][] arr; static int n; static int min = Integer.MAX_VALUE; static boolean[] visited; public static void main(String[] args) throws IOException { Scanner sc = new Scanner(System.in); n = sc.nextInt(); arr = new int[n][n]; visited = new boolean[n]; for(int i=0; i<n; i++) { for(int j=0; j<n; j++) { arr[i][j] = sc.nextInt(); } } combi(0,0); System.out.println(min); } static void combi(int idx,int count) { if(count == n/2) { diff(); return; } for(int i=idx; i<n; i++) { if(!visited[i]) { visited[i]= true; combi(i+1,count+1); visited[i]= false; } } } static void diff() { int startTeam = 0; int linkTeam = 0; for(int i=0; i<n-1; i++) { for(int j=i+1; j<n; j++) { if(visited[i]==true && visited[j]==true) { startTeam += arr[i][j]; startTeam += arr[j][i]; } else if(visited[i]==false && visited[j]==false) { linkTeam += arr[i][j]; linkTeam += arr[j][i]; } } } int diff = Math.abs(startTeam - linkTeam); if(diff ==0) { System.out.println(0); System.exit(0); } min = Math.min(min, diff); } }
참고블로그
'알고리즘' 카테고리의 다른 글
[java] 백준 3048 개미 (0) 2023.09.05 [java] 프로그래머스 다트 게임 (0) 2023.08.10 [java] 프로그래머스 크레인 인형뽑기 (0) 2023.08.09 프로그래머스 할인행사 (0) 2023.08.08 [java] 백준 16967 : 배열 복원하기 (0) 2023.08.06