보글보글 개발일지
반응형

문제

 

1931번: 회의실 배정

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

www.acmicpc.net

알고리즘

그리디

서로 겹치지 않는 회의에 대해 종료시간이 빠르면 더 많은 활동을 선택할 수 있는 시간이 많아진다

끝나는 시간을 기준으로 오름차순 정렬을 진행한다. 이때 끝나는 시간이 동일하다면 시작 시작이 더 빠른 것이 앞쪽으로 오게된다.

 

코드1

package algo0317;

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 B1931_회의실배정 {

	public static void main(String[] args) throws IOException {
		// TODO Auto-generated method stub

		BufferedReader br = new BufferedReader(new InputStreamReader(System.in));
		StringTokenizer st = new StringTokenizer(br.readLine());

		int n = Integer.parseInt(st.nextToken());
		int[][] time = new int[n][2];
		for (int i = 0; i < n; i++) {
			st = new StringTokenizer(br.readLine());
			time[i][0] = Integer.parseInt(st.nextToken()); // 시작시간
			time[i][1] = Integer.parseInt(st.nextToken()); // 종료시간
		}

		// 끝나는 시간을 기준으로 정렬. 이때 종료 시간이 같으면 시작 시간을 기준으로 정렬
		Arrays.sort(time, new Comparator<int[]>() { // 정렬의 대상이 1차원 배열이다.
			@Override
			public int compare(int[] s, int[] e) {
				if (s[1] == e[1]) { //종료 시간이 같은 경우
					return s[0] - e[0]; //시작 시간을 기준으로 정렬한다.
				}
				return s[1] - e[1];
			}
		});
		int count = 0;
		int end = -1;
		for(int i = 0;i<n;i++) {
			if(time[i][0]>=end) {
				//직전 종료 시간이 다음 회의 시작 시간보다 작거나 같다면 갱신
				end = time[i][1];
				count++;
			}
		}
		System.out.println(count);
	}

}

코드2 - 배열이 아닌 클래스를 생성하여 문제 해결

package algo0317;

import java.io.BufferedReader;
import java.io.IOException;
import java.io.InputStreamReader;
import java.util.ArrayList;
import java.util.Arrays;
import java.util.List;
import java.util.StringTokenizer;

public class B1931_회의실배정2 {
    public static int getSchedule(Meeting[] m) {

        Arrays.sort(m); // 회의 종료시간(오름) 순서대로 정렬
        int beforeEnd = m[0].end; // 첫번째 회의 확정
        int cnt = 1;
        for (int j = 1; j < m.length; j++) {
            // 확정된 앞 회의의 종료시간이 다음 회의시작보다 같거나 크다면 회의 확정
            if (beforeEnd <= m[j].start) {
                ++cnt;
                beforeEnd = m[j].end;
            }
        }
        return cnt;
    }

    public static void main(String[] args) throws NumberFormatException, IOException {
        BufferedReader br = new BufferedReader(new InputStreamReader(System.in));
        int count = Integer.parseInt(br.readLine().trim());
        Meeting m[] = new Meeting[count];

        StringTokenizer st = null;
        for (int i = 0; i < count; i++) {
            st = new StringTokenizer(br.readLine());
            m[i] = new Meeting(Integer.parseInt(st.nextToken()), Integer.parseInt(st.nextToken()));
        }
        System.out.println(getSchedule(m));
    }
    
    static class Meeting implements Comparable<Meeting> {
        int start;
        int end;
        
        public Meeting(int start, int end) {
            super();
            this.start = start;
            this.end = end;
        }

        @Override
        public int compareTo(Meeting o) {
            if(this.end==o.end){
            	return this.start-o.start;// 종료시간이 같을 경우 시작시간이 빠른 순으로 정렬되도록 한다.
            }
            return this.end-o.end;
        }
    }
   }
반응형

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

[백준/13023][Java] ABCDE  (0) 2023.03.17
[백준/1920][Java] 수찾기  (0) 2023.03.17
[백준/11724][Java] 연결요소의 개수  (0) 2023.03.16
[백준/15650][Java] N과 M(2)  (2) 2023.03.14
[백준/15649][Java] N과 M(1)  (0) 2023.03.14
profile

보글보글 개발일지

@보글

포스팅이 좋았다면 "좋아요❤️" 또는 "구독👍🏻" 해주세요!