공부하는 스누피

[JAVA] 스타트와 링크 - DFS 본문

Algorithms/코딩테스트 문제풀이

[JAVA] 스타트와 링크 - DFS

커피맛스누피 2020. 8. 19. 18:40

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

생각과정

- 팀원이 추가될 때마다 기존 팀원들과 추가된 팀원 상호간 더해지는 능력치를 추가

- 팀 구성이 완료되면 능력치 차이 최솟값 구하기 (dfs)

 

구현

package baekjoon;

import java.util.ArrayList;
import java.util.List;
import java.util.Scanner;

public class b14889 {
	public int minA = Integer.MAX_VALUE;
	
	public void b14889(int n, int[][]ary, ArrayList<Integer> t1, ArrayList<Integer> t2, int T1ability, int T2ability, int person) {
		if(person==n) {
			//System.out.println("T1: " + T1ability + " T2: " + T2ability);
			minA = Math.min(minA, Math.abs(T1ability - T2ability));
			return;
		}
		
		ArrayList<Integer>T1 = new ArrayList();
		ArrayList<Integer>T2 = new ArrayList();

		T1.addAll(t1);
		T2.addAll(t2);
		
		boolean changedT1 = false;
		int newAbility = T1ability;
		if(T1.size()< n/2) {
			//능력치 추가
			for(int i=0;i<T1.size();i++) {
				newAbility += ary[T1.get(i)][person];
				newAbility += ary[person][T1.get(i)];
			}
			//T1에 추가
			T1.add(person);
			changedT1 = true;
			b14889(n, ary, T1, T2, newAbility, T2ability, person+1);
		}
		
		//초기화
		newAbility = T2ability;
		if(T1.size()>0 && changedT1 ==true)
			T1.remove(T1.size()-1);
		
		if(T2.size()< n/2) {
			//능력치 추가
			for(int i=0;i<T2.size();i++) {
				newAbility += ary[T2.get(i)][person];
				newAbility += ary[person][T2.get(i)];
			}
			//T2에 추가
			T2.add(person);
			b14889(n, ary, T1, T2, T1ability, newAbility, person+1);
		}
		
	}

	public static void main(String[] args) {
		// TODO Auto-generated method stub
		Scanner s = new Scanner(System.in);
		int n = s.nextInt();
		int [][]ary = new int[n][n];
		
		for(int i=0;i<n;i++) {
			for(int j=0;j<n;j++) {
				ary[i][j] = s.nextInt();
			}
		}
		
		ArrayList<Integer> t1 = new ArrayList();
		ArrayList<Integer> t2 = new ArrayList();
		
		b14889 b = new b14889();
		b.b14889(n, ary, t1, t2, 0, 0, 0);
		
		System.out.println(b.minA);
	}

}

 

Result

팀원 수가 고정임에도 배열 안쓰고 ArrayList 써서 그런지 메모리가 엄청 많이 쓰였다ㄷㄷ

 

 

ArrayList deep copy하는 법

ArrayList A와 ArrayList B가 있을 때, A = B라고 하면 A가 B와 같은 주소를 참조하기 때문에 A를 수정하면 B도 수정된다. 이때, A.addAll(B)를 사용하면 B의 요소 전체를 A에 더하기 때문에 Deep copy를 할 수 있다. 메모리/시간을 엄청 잡아먹으니 주의..

 

참고

https://library1008.tistory.com/47

 

ArrayList 깊은 복사(deep copy) vs 얕은 복사(shallow copy)

자바(Java) 에 대해 공부하면서 다음과 같은 말을 많이 들어보았을 것입니다. 깊은 복사(deep copy) 와 얕은 복사(shallow copy) 참조 복사(call by reference) 와 값 복사(call by value) 값을 다른 곳에 복사하..

library1008.tistory.com

https://snoop-study.tistory.com/2

 

[JAVA] 완주하지 못한 선수 - ArrayList

https://programmers.co.kr/learn/courses/30/lessons/42576 코딩테스트 연습 - 완주하지 못한 선수 수많은 마라톤 선수들이 마라톤에 참여하였습니다. 단 한 명의 선수를 제외하고는 모든 선수가 마라톤을 완주.

snoop-study.tistory.com

 

'Algorithms > 코딩테스트 문제풀이' 카테고리의 다른 글

[Python] 베스트앨범 - Hash  (0) 2020.08.28
[JAVA] 피보나치 - DP  (0) 2020.08.23
[JAVA] 퇴사 - DFS  (0) 2020.08.19
[JAVA] 문자열 압축 - StringBuffer  (0) 2020.08.02
[JAVA] 다트 게임 - StringBuffer  (0) 2020.07.26
Comments