회의실 배정(1931번)

PearLine_Zero·2024년 5월 21일

하루에 1커밋 CodingTest

목록 보기
102/110
post-thumbnail
  • 티어 : Sliver 1
  • 정답여부 : 오답
  • 알고리즘 유형 : 그리디 알고리즘, 정렬
  • 시간 제한 : 2초

💡문제

한 개의 회의실이 있는데 이를 사용하고자 하는 N개의 회의에 대하여 회의실 사용표를 만들려고 한다. 각 회의 I에 대해 시작시간과 끝나는 시간이 주어져 있고, 각 회의가 겹치지 않게 하면서 회의실을 사용할 수 있는 회의의 최대 개수를 찾아보자. 단, 회의는 한번 시작하면 중간에 중단될 수 없으며 한 회의가 끝나는 것과 동시에 다음 회의가 시작될 수 있다. 회의의 시작시간과 끝나는 시간이 같을 수도 있다. 이 경우에는 시작하자마자 끝나는 것으로 생각하면 된다..

💡입력

첫째 줄에 회의의 수 N(1 ≤ N ≤ 100,000)이 주어진다. 둘째 줄부터 N+1 줄까지 각 회의의 정보가 주어지는데 이것은 공백을 사이에 두고 회의의 시작시간과 끝나는 시간이 주어진다. 시작 시간과 끝나는 시간은 231-1보다 작거나 같은 자연수 또는 0이다

💡출력

첫째 줄에 최대 사용할 수 있는 회의의 최대 개수를 출력한다.

💡예제 입력 1

11
1 4
3 5
0 6
5 7
3 8
5 9
6 10
8 11
8 12
2 13
12 14

💡예제 출력 1

4

💡문제요약

  • 각 회의 수 중 겹치지 않고 최대 사용할수 있는 회의를 구하면 되는 문제.

💡알고리즘 설계

  • N : 회의의 수
  • int[N][2]: N 회의에 회의 시작시간과 끝나는 시간을 입력받을 배열
    • ex) → 0번째 배열에 1, 4를 입력받음 즉 0번 회의실에서 1시부터 4시까지 회의하는 방이라고 생각하면 편함
  1. 각 회의를 하고 있는 시작 시간과 끝나는 시간을 입력받는다.
  2. 입력받은 회의시간을 끝나는 시간을 기준으로 정 (2차원 정렬방법으로 외우는 걸 추천)
  3. 각 2차원 배열에 회의가 끝나는 시간을 반복해주는데 만약 끝나는 시간이 크거나 같으면(회의 끝나는 시간은 겹칠수 있음!)
  4. time ++; 한 다음 end에 그 회의에 끝나는 시간을 넣어줌

💡작성코드

  • Java
import java.util.*;
import java.io.*;
public class Main {
	public static void main(String[] args) throws IOException {
		BufferedReader br = new BufferedReader(new InputStreamReader(System.in));
		int N = Integer.parseInt(br.readLine());
		int meeting [][] = new int[N][2];
		for(int i = 0; i < N; i++) {
			StringTokenizer st = new StringTokenizer(br.readLine());
			meeting[i][0] = Integer.parseInt(st.nextToken()); // 시작 시간
			meeting[i][1] = Integer.parseInt(st.nextToken()); // 종료 시간
		}
		Arrays.sort(meeting, new Comparator<int[]>() { // 2차원 정렬
			public int compare(int[] o1, int[] o2) {
				if(o1[1] == o2[1])
					return o1[0] - o2[0];
				return o1[1] - o2[1];
			}
		});	 
		int time = 0; // 그리디 최대 회의 수 구하기
		int end = 0; // 회의가 끝나는 시간
		for(int i = 0 ; i < N ;i++) { 
			if(end <= meeting[i][0]) { // 회의가 끝나는 시간이 같거나 크다면
				time++; // 횟수 +1
			end = meeting[i][1]; // end에 회의 끝나는 시간을 넣어줌
			}
		}
		System.out.println(time);
	}
}

💡시간복잡도

O(NlogN)

💡틀린 이유 or 수정할 부분

2차원 정렬 방법을 몰라서 구글링했다…

List와 Collections.sort 을 사용한 코드를 가져왔다.!

💡틀린 부분 수정 or 다른풀이

  • Java
package algorithms_Java03_02;
import java.util.*;
import java.io.*;
public class baekjoon_1931 {
    public static void main(String[] args) throws IOException {
        BufferedReader br = new BufferedReader(new InputStreamReader(System.in));
        int N = Integer.parseInt(br.readLine());
        List<int[]> meetings = new ArrayList<>();  
        for (int i = 0; i < N; i++) {
            StringTokenizer st = new StringTokenizer(br.readLine());
            int[] meeting = new int[2];
            meeting[0] = Integer.parseInt(st.nextToken()); // 시작 시간
            meeting[1] = Integer.parseInt(st.nextToken()); // 종료 시간
            meetings.add(meeting);
        }
        Collections.sort(meetings, (o1, o2) -> {
            if (o1[1] != o2[1]) {
                return o1[1] - o2[1];
            } else {
                return o1[0] - o2[0];
            }
        });
        int time = 0; // 그리디 최대 회의 수 구하기
        int end = 0; // 회의가 끝나는 시간        
        for (int[] meeting : meetings) {
            if (end <= meeting[0]) { // 회의가 끝나는 시간이 같거나 크다면
                time++; // 횟수 +1
                end = meeting[1]; // end에 회의 끝나는 시간을 넣어줌
            }
        }
        System.out.println(time);
    }
}

💡느낀점 or 기억할 정보

문제도 이해갔고 코드 구현도 생각을 했지만 2차원 정렬 방법을 몰라서 틀린게 아쉬운 문제이다 ㅠ...

profile
https://baesaa0304.tistory.com 블로그 이사합니다~

0개의 댓글