날짜를 파싱하는 방법이 정말 예술이기에 글을 쓰지 않을 수 없었다.
풀이
날짜의 간격을 구해서 풀려고 했으나, 간격과는 하등 상관 없다는 것을 답을 보고 알았다.
for(int i= 0; i < n; ++i){
int m1, d1, m2, d2;
cin >> m1 >> d1 >> m2 >> d2;
v.push_back({m1*100+d1, m2*100+d2});
}
//3월 1일 = 301
//5월 28일 = 528
위와 같이 날짜를 파싱한다.
3월 1일 부터 11월 30일 까지만 꽃이 연속하여 피어 있기만 하면 된다고 한다.
계속 계속 비교해가며 가장 최소를 구해준다. 말로 설명하기 어려우니 코드로 보자
int ans = 0;
int t = 301;
while(t < 1201){
int nxt = t;
for(int i = 0; i < n; ++i)
if(v[i].X <= t && v[i].Y > nxt)
nxt = v[i].Y;
if(nxt == t){
cout << 0;
return 0;
}
ans++;
t = nxt;
}
시작시간은 301(3월 1일)이고 while문이 실행 될 때마다 nxt에 t를 넣어준다.
그리고 for문에서 현재 시간보다 더 낮거나 같고 && 다음 시간보다 더 큰 값을 찾는다.
즉 끝나는 날짜를 최대로 해야 최소값으로 꽃을 오래 볼 수 있기 때문이다.
그런데 만약에 모든 비교후에도 nxt와 t가 같다면 더이상 할 것이 없고 정상적인 종료가 아니기에 0을 출력하고 끝낸다.
전체 코드
#include <bits/stdc++.h>
#define X first
#define Y second
using namespace std;
void init(){
ios_base::sync_with_stdio(false);
cin.tie(0);
cout.tie(0);
}
int n;
vector<pair<int, int>> v;
int main(){
init();
cin >> n;
for(int i= 0; i < n; ++i){
int m1, d1, m2, d2;
cin >> m1 >> d1 >> m2 >> d2;
v.push_back({m1*100+d1, m2*100+d2});
}
int ans = 0;
int t = 301;
while(t < 1201){
int nxt = t;
for(int i = 0; i < n; ++i)
if(v[i].X <= t && v[i].Y > nxt)
nxt = v[i].Y;
if(nxt == t){
cout << 0;
return 0;
}
ans++;
t = nxt;
}
cout << ans;
return 0;
}