본문 바로가기

알고리즘 문제풀이

[JAVA] 백준 #19621 회의실 배정2

문제

서준이는 아빠로부터 N개의 회의와 하나의 회의실을 선물로 받았다. 각 회의는 시작 시간, 끝나는 시간, 회의 인원이 주어지고 한 회의실에서 동시에 두 개 이상의 회의가 진행될 수 없다. 단, 회의는 한번 시작되면 중간에 중단될 수 없으며 한 회의가 끝나는 것과 동시에 다음 회의가 시작될 수 있다. 회의의 시작 시간은 끝나는 시간보다 항상 작다. N개의 회의를 회의실에 효율적으로 배정할 경우 회의를 진행할 수 있는 최대 인원을 구하자.

 

입력

첫째 줄에 회의의 수 N이 주어진다. 둘째 줄부터 N + 1 줄까지 공백을 사이에 두고 회의의 시작시간, 끝나는 시간, 회의 인원이 주어진다.

 

출력

첫째 줄에 회의실에서 회의를 진행할 수 있는 최대 인원을 출력한다.

 

제한

  • 1 ≤ N ≤ 25
  • 임의의 회의 K(1≤ K ≤ N)는 회의 K − 1과 회의 K + 1과는 회의 시간이 겹치고 다른 회의들과는 회의 시간이 겹치지 않는다.
  • 모든 회의의 시작 시간과 끝나는 시간은 231 − 1보다 작거나 같은 자연수 또는 0이다.
  • 모든 회의의 시작 시간과 끝나는 시간은 서로 다르다.
  • 회의 인원은 1,000보다 작거나 같은 자연수 이다.

예제 입출력

문제풀이

부분집합 

  • 임의의 회의 K(1≤ K ≤ N)는 회의 K − 1과 회의 K + 1과는 회의 시간이 겹치고 다른 회의들과는 회의 시간이 겹치지 않는다.
    -- 해당 조건이 있어서 부분 집합 만드는 메서드에서 i+2로 start지점을 정해주었다.

 

 

코드

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

public class Main {
	static int tc;
	static int[][] arr;
	static int max=0;
	public static void main(String[] args) throws NumberFormatException, IOException {
		BufferedReader br = new BufferedReader(new InputStreamReader(System.in));
		tc = Integer.parseInt(br.readLine());
		arr = new int[tc][3];
		for (int i = 0; i < tc; i++) {
			StringTokenizer st = new StringTokenizer(br.readLine());
			arr[i][0] = Integer.parseInt(st.nextToken());
			arr[i][1] = Integer.parseInt(st.nextToken());
			arr[i][2] = Integer.parseInt(st.nextToken());
		}
		
		sub(0,0);
		System.out.println(max);
		
	}

	private static void sub(int s,int sum) {
		if(s>tc-1) {
			if(max<sum) max=sum;
			return;
		}
		for(int i=s;i<tc;i++) {
			sub(i+2,sum+arr[i][2]);
		}
		
	}
}