새소식

💻 Computer/🐘 Algorithm

[2457] 공주님의 정원 - C++

  • -

날짜를 파싱하는 방법이 정말 예술이기에 글을 쓰지 않을 수 없었다.

 

풀이

날짜의 간격을 구해서 풀려고 했으나, 간격과는 하등 상관 없다는 것을 답을 보고 알았다.

 

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;
}

'💻 Computer > 🐘 Algorithm' 카테고리의 다른 글

[2146] 다리 만들기 - C++  (0) 2023.08.23
[1456] 거의 소수 - C++  (0) 2023.07.14
[2156] 포도주 시식 - C++  (0) 2023.07.02
[1520] 내리막 길 - C++  (0) 2023.06.30
[2133] 타일 채우기 - C++  (0) 2023.06.29
Contents

포스팅 주소를 복사했습니다

이 글이 도움이 되었다면 공감 부탁드립니다.