[BOJ] 1931 : 회의실
Question
Solution
- 끝나는 시간을 기준으로 오름차순 정렬한다
- 1 ~ 3, 3 ~ 3 과 같은 예외가 있기 때문에 시작 시간을 기준으로 오름차순으로 한번더 정렬한다
- i의 끝나는 시간과 i+1의 시작 시간을 판별한다 (끝나는 시간을 기준으로 정렬했기 때문에 맨 처음 오는 것은 무조건 카운트 된다고 봐도 무방하다)
Cord
C#
using System;
using System.Linq;
namespace ConsoleApp1
{
class Program
{
static void Main()
{
int answer = 0;
int rooms = int.Parse(Console.ReadLine());
int currentTime = 0;
// 튜플타입의 배열
(int start, int end)[] meetingTime = new (int, int)[rooms];
for (int idx = 0; idx < rooms; idx++)
{
string timeString = Console.ReadLine();
string[] InputTimes = timeString.Split();
meetingTime[idx].start = int.Parse(InputTimes[0]);
meetingTime[idx].end = int.Parse(InputTimes[1]);
}
// end 시간기준 오름정렬 후 start 시간기준 재정렬
meetingTime = meetingTime.OrderBy(x => x.end).ThenBy(x => x.start).ToArray();
for (int idx = 0; idx < rooms; idx++)
{
if (meetingTime[idx].start >= currentTime)
{
currentTime = meetingTime[idx].end;
answer++;
}
}
Console.WriteLine(answer);
}
}
}
Tuple과 Linq의 Orderby,ThenBy에 대해 처음 사용해보았다.
확실히 Linq를 사용하면 굉장히 간편해 지는거 같다.
그리고 까먹지 말자…
[C++]
#include <iostream>
#include <vector>
#include <algorithm>
using namespace std;
bool compare(pair<int, int> _a, pair<int, int> _b)
{
if (_a.second == _b.second) { return _a.first < _b.first; }
return _a.second < _b.second;
}
int main()
{
int answer = 0;
int rooms;
int start, end;
int currentTime = 0;
cin >> rooms;
vector<pair<int, int>> meetingTime(rooms);
for (int idx = 0; idx < meetingTime.size(); idx++)
{
cin >> meetingTime[idx].first >> meetingTime[idx].second;
}
// 정렬 기준 재정의
sort(meetingTime.begin(), meetingTime.end(), compare);
for (int idx = 0; idx < rooms; idx++)
{
if (meetingTime[idx].first >= currentTime)
{
currentTime = meetingTime[idx].second;
answer++;
}
}
cout << answer;
return 0;
}
Result
자료 구조 타입명이나 매소드들의 이름과 사용법이 C#과 조금씩 차이가 있으니 잘 구분해보자