은세고화
뚜렷한 기억보단 흐릿한 잉크를
은세고화
전체 방문자
오늘
어제
  • 분류 전체보기 (95)
    • TDD (2)
      • 학점 산출 프로그램 (2)
    • IT (43)
      • 부스트코스 (18)
      • CS50 (3)
      • 도서추천 알고리즘 (2)
      • 스터디 일정 (3)
      • 스프링 (3)
      • 프로젝트 개발 중 발생한 에러 (8)
      • 웹개발 (3)
      • DB (3)
    • 독서 후기 (12)
      • 도서 (12)
    • e북 (3)
    • 알고리즘 (26)
    • 프로젝트 (6)
      • 향수 (6)
    • 회고 (1)

블로그 메뉴

  • 홈

공지사항

인기 글

티스토리

hELLO · Designed By 정상우.
글쓰기 / 관리자
은세고화

뚜렷한 기억보단 흐릿한 잉크를

알고리즘

백준 14889 자바 스타트와 링크

2022. 3. 22. 21:16
반응형

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

 

 

접근 아이디어

조합으로 풀었다. tgt배열에 true false값을 넣어서 조합의 절반만 순회하도록 하고 절반을 순회했다면 연산을 했다.

2중for문에 j = i+1을 하면서 대각선기준 아랫방향은 접근하지 않도록 하고 ij와 ji를 더해서 최솟값을 갱신하는 방식으로 풀었다.

 

잘 한 부분

조합을 생각한 것과 절반만 순회하는 아이디어를 잘 떠올렸다. 합칠 때도 양쪽을 한번에 구하는 방식을 어렵지 않게 구현했다.

 

부족한 부분

조합을 수행할 때 start+1을 재귀하는 것이 아니라 i+1을 재귀해야 하는데 이때문에 계속 시간초과가 났다. 또한 j = i+1도 잘 떠오르지 않았다.

 

 

 

package backjon;

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

public class 스타트와링크_14889 {

	static int N;
	static int[][] src;
	static boolean[] tgt;
	static int min;
	
	public static void main(String[] args) throws NumberFormatException, IOException {
		BufferedReader br = new BufferedReader(new InputStreamReader(System.in));
		N = Integer.parseInt(br.readLine());
		tgt = new boolean[N];
		src = new int[N][N];
		
		for (int i = 0; i < N; i++) {
			StringTokenizer st = new StringTokenizer(br.readLine());
			for (int j = 0; j < N; j++) {
				src[i][j] = Integer.parseInt(st.nextToken());
			}
		}
		min = Integer.MAX_VALUE;
		comb(0, 0);
		System.out.println(min);

	}

	private static void comb(int depth, int start) {
		if(depth == N/2) {
			sum();
			return;
		}
		
		for (int i = start; i < N; i++) {
			tgt[i] = true;
			comb(depth+1, i+1);
			tgt[i] = false;
		}
		
	}

	private static void sum() {
		int lsum = 0;
		int rsum = 0;
		for (int i = 0; i < N; i++) {
			for (int j = i+1; j < N; j++) {
				if(tgt[i] && tgt[j]) {
					lsum += src[i][j] + src[j][i];
				}
				else if(!tgt[i] && !tgt[j]) {
					rsum += src[i][j] + src[j][i];
				}
			}
		}
		
		min = Math.min(min, Math.abs(lsum - rsum));
	}
}
반응형
저작자표시 (새창열림)

'알고리즘' 카테고리의 다른 글

여행경로 자바  (0) 2022.09.06
백준 1003 피보나치 함수 자바  (1) 2022.03.22
백준 14888 자바 연산자 끼워넣기  (1) 2022.03.22
백준 2580 스도쿠 자바  (0) 2022.03.19
백준 9663 N-Queen 자바  (0) 2022.03.17
    '알고리즘' 카테고리의 다른 글
    • 여행경로 자바
    • 백준 1003 피보나치 함수 자바
    • 백준 14888 자바 연산자 끼워넣기
    • 백준 2580 스도쿠 자바
    은세고화
    은세고화

    티스토리툴바