728x90
//프로그래머스에서는 main함수 및 입출력문이 필요하지 않습니다. 대신 solution함수만 작성하면 됩니다.
#include <iostream>
#include <vector>
#include <algorithm>
/*
Greedy Algorithm
"종료시간"이 빠른 순서대로 2자리를 아무곳이나 배치
하지만 종료시간이 동일하다면 시작시간이 더 빠른 것을 먼저 배치
sort(T start, T end, Compare comp);
sort(정렬 시작,정렬의 끝, 기준함수)
start<= 범위 <end 로 정렬하기 때문에 주의하기! (마지막 포함아님 )
Compare comp?
오름차순으로 만들 것인가 내림 차순으로 만들 것인가? 를 결정할 수 있음
(a,b) 순서대로 매개변수가 들어왔을 때
a를 기준으로 함
a가 b에 비해 크다 (a>b) -> 내림차순
a가 b에 비해 작다 (a<b) -> 오름차순
*/
using namespace std;
//시작시간 배열(s) , 끝나는 시간 배열(e)를 세트로 묶은 pair vector
vector<pair<int,int>> v;
//sort 함수를 사용할 때 기준이 되게 하는 함수
bool compare(pair<int,int>a, pair<int,int>b){
//first : 시작 예약 시간 , second : 끝나는 시간
if(a.second == b.second) // 만약 끝나는 시간이 둘이 같은경우 시작 시간이 이른 것이 앞으로
return a.first < b.first; //참이면 1, 거짓이면 0 -> 1이면 (작은걸)a를 앞으로 (오름차순)
else//다른 경우 끝나는 시간이 빠른게 앞으로
return a.second < b.second; //참이면 1, 거짓이면 0 -> 1이면 a를 앞으로 (오름차순)
}
int solution(vector<int> s, vector<int> e,int n){
int answer = 0;
//2개의 좌석 -> 각각 이용이 끝나는 시간을 저장함(각 학생의 퇴실시간(?))
int e1 = -1;
int e2 = -1;
//s와 e 배열을 하나의 pair로 만들기
for (int i=0; i<n; i++){
v.push_back({s[i],e[i]});
}
//끝나는 순서대로 정렬
sort(v.begin(),v.end(),compare);
//배치
for(int i=0; i<n; i++){
if(e1<=v[i].first){ //해당 좌석의 끝나는 시간이 예약자의 시작 시간보다 작은경우 ->이용가능
answer++;
e1 = v[i].second; // 끝나는 시간으로 갱신
}
else if(e2<=v[i].first){ //좌석1은 이용불가능이고, 2는 이용가능함
//코드에서 항상 1번을 먼저 고려하기 때문에 1번자리 학생을 2번으로 보내고
// 2번자리에 할당될 학생을 1번 자리에 배정함
e2 = e1; // 1번에 앉았던 애를 2번으로 옮김
e1 = v[i].second; //지금 현재 앉힐 학생을 1번에 배정
answer++;
}
}
return answer;
}
int main() {
//배열
vector<int> s;
vector<int> e;
int n;
int min;
cin>>n;
for(int i=0;i<n;i++){
cin>>min;
s.push_back(min);
}
for(int i=0;i<n;i++){
cin>>min;
e.push_back(min);
}
cout<< solution(s,e,n);
return 0;
}
728x90
'Algorithm > 기타(기업등)' 카테고리의 다른 글
[EPPER/13회 2번]거스름돈 계산(하-4) (0) | 2021.03.18 |
---|---|
[EPPER/14회 8번]토마토 보관(중-3) (0) | 2021.03.18 |
[EPPER/11회 9번]올바른 괄호 배열 구하기(중-2) (0) | 2021.03.17 |
[EPPER/13회 7번]회문을 만들기 까지의 횟수(중-1) (0) | 2021.03.17 |
[EPPER/12회 2번] 즐거운OT 방번호만들기(하-3) (0) | 2021.03.16 |