[코딩테스트] BJ1931 회의실 배정 - C++, PYTHON

Coffee Time☕·2021년 2월 13일
0

코딩테스트

목록 보기
19/42

✔문제

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

✔입력

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

✔출력

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

💕문제 풀이

회의를 최대한 많이 진행할 수 있도록 회의실을 배정해야한다. 먼저, 회의의 시간이 짧은 순으로 배치를 시도하였다. 그렇지만, 종료 시간이 더 빠른 회의를 우선으로 배치하는 것이 더 많은 회의를 진행시킬 수 있음을 알게 되었다. 따라서 겹치는 시간대의 회의끼리는 서로 비교하여 종료 시간이 빠른 것을 택하고, 겹치지 않는 경우는 스케줄 벡터에 push하며 진행하였다.

처음에는 회의의 시작시간과 끝시간이 같은 회의에 대한 처리를 개별적으로 해주었으나, (1,3) (2,2) 와 같은 경우, (2,2) 회의가 중간에 개입할 수 없으므로 개별적인 처리 대신 겹치지 않은 if문에 부등호를 처리해주어야 했다.

💖 c++ 코드

#include <iostream>
#include <vector>
#include <algorithm>
using namespace std; 

int main() {

	int n;
	int count = 0;
	cin >> n; 
	
	vector< pair<int, int> > start_end; 
	vector <pair<int,int>> schedule; 

	for (int i = 0; i < n; i++) {
		int a, b;
		cin >> a >> b;
		start_end.push_back(make_pair(a,b));
	}

	sort(start_end.begin(), start_end.end());


	for (int i = 0; i < n; i++) {
		if (schedule.empty()) {
			schedule.push_back(make_pair(start_end[i].first, start_end[i].second));
			count++; 
		}
		else {
			 if ( start_end[i].first< schedule[count - 1].second && start_end[i].second<schedule[count-1].second) {
				schedule.pop_back();
				schedule.push_back(make_pair(start_end[i].first, start_end[i].second));
			} //겹치는 시간이 없는 경우 push back 
			else if (schedule[count - 1].second <= start_end[i].first) {
				schedule.push_back(make_pair(start_end[i].first, start_end[i].second));
				count++; 
			}
		}
	}

	cout << count << endl;

	return 0;
}

💖파이썬 코드


n = int(input())
start_end = []
schedule  = [] 
count = 0 

for i in range(0,n) : 
    a,b = input().split(' ')
    a = int(a)
    b= int(b)
    start_end.append([a,b])

start_end = sorted(start_end,key= lambda x:(x[0], x[1]))


for i in range(n): 
    #스케줄 리스트가 비어있는 경우
    if not schedule: 
        schedule.append([start_end[i][0],start_end[i][1]])
        count += 1 
    #스케줄 리스트가 비어있지 않은 경우 
    else: 
        #스케줄 리스트와 곂치는 회의인 경우 
        #더 일찍 끝나는 회의인지 확인
        if start_end[i][0]<schedule[count-1][1] and start_end[i][1]<schedule[count-1][1]:
            schedule.pop(count-1)
            schedule.append([start_end[i][0],start_end[i][1]])
        elif schedule[count-1][1]<= start_end[i][0]: 
            schedule.append([start_end[i][0],start_end[i][1]])
            count +=1 

print(count)
            
  • 파이썬 포인트
  1. 이차원 배열 append
    arr.append([a,b])
  2. 이차원 배열 sort
    arr = sorted( arr, key= lambda x:(x[0],x[1]))

0개의 댓글