https://www.acmicpc.net/problem/1931

 

1931번: 회의실 배정

(1,4), (5,7), (8,11), (12,14) 를 이용할 수 있다.

www.acmicpc.net

코드설명

탐욕법(Greedy) + 정렬(Sort) 을 활용합니다.

 

이 문제에서 핵심은, 끝나는 시간이 가장 빠르고, 끝나는 시간이 같다면 시작시간이 빠른 회의실을 차례차례 진행하는 것 입니다.

이떄 처음에 시작시간이 빠른 것은 고려하지 못하여 90%쯤에서 계속해서 틀렸습니다.

3
4 4
3 4
2 4
my output : 1
answer : 2

코드

정답코드 1입니다. Comparable을 활용하여 정렬했습니다. 직접 Comparable Interface를 구현한 모습이지요.

//Comparable 인터페이스를 implements합니다.
class Conference implements Comparable<Conference>{
private int starttime;
private int endtime;
public Conference(int starttime,int endtime) {
this.starttime = starttime;
this.endtime = endtime;
}
public int getStarttime() {
return starttime;
}
public void setStarttime(int starttime) {
this.starttime = starttime;
}
public int getEndtime() {
return endtime;
}
public void setEndtime(int endtime) {
this.endtime = endtime;
}
// return 양수 : 변화있음(오름차순: this - other, 내림차순: other - this)
@Override
public int compareTo(Conference other) {
//종료시간을 기준으로 오름차순으로 정렬하고, 종료시간이 같을시 시작시간 기준으로 오름차순 정렬합니다.
if(this.endtime == other.endtime) {
return this.starttime - other.starttime;
}
return this.endtime - other.endtime;
}
@Override
public String toString() {
return "toString test:"+starttime+" "+endtime+"\n";
}
}
public class Main {
public static int N;
public static int starttime,endtime;
public static int count=0, prev_endtime = 0;
public static List<Conference> conferencelist = new ArrayList<>();
public static void main(String[] args) {
Scanner sc = new Scanner(System.in);
N=sc.nextInt();
for(int i=0;i<N;i++) {
starttime = sc.nextInt();
endtime = sc.nextInt();
conferencelist.add(new Conference(starttime, endtime));
}
Collections.sort(conferencelist);
// System.out.println(conferencelist);
for(int i=0;i<N;i++) {
if(prev_endtime <= conferencelist.get(i).getStarttime()) {
prev_endtime = conferencelist.get(i).getEndtime();
count+=1;
}
}
System.out.println(count);
}
}

 

이번에는 배열로 익명 Comprator를 정렬해서 사용합니다.

package Main;
import java.io.BufferedReader;
import java.io.IOException;
import java.io.InputStreamReader;
import java.util.Arrays;
import java.util.Comparator;
import java.util.StringTokenizer;
public class Main {
static int N, M, S, P, A, B, X, L, R, C, n, k, m, l, K, D;
static int answer = 0;
static int[][] arr = new int[100001][2];
public static void main(String[] args) throws IOException{
BufferedReader br = new BufferedReader(new InputStreamReader(System.in));
StringTokenizer st = new StringTokenizer(br.readLine());
N = Integer.parseInt(st.nextToken());
arr = new int[N][2];
for(int i = 0; i<N; i++) {
st = new StringTokenizer(br.readLine());
arr[i][0] = Integer.parseInt(st.nextToken());
arr[i][1] = Integer.parseInt(st.nextToken());
}
Arrays.sort(arr, 0, N, new Comparator<int[]>() {
@Override
public int compare(int[] a, int[] b) {
if(a[1] != b[1]) {
return Integer.compare(a[1], b[1]);
}
return Integer.compare(a[0], b[0]);
}
});
int lastTime = -1;
for(int i=0; i<N; i++) {
if(lastTime <= arr[i][0]) {
answer += 1;
lastTime = arr[i][1];
}
}
System.out.println(answer);
}
}

+ Recent posts