1 분 소요

Question

1931Q


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

1931Sharp

1931

자료 구조 타입명이나 매소드들의 이름과 사용법이 C#과 조금씩 차이가 있으니 잘 구분해보자