백준 2094 강수량
사용한 알고리즘: Brute Force (완전탐색)
- Y년도, X년도, 그리고 그 사이의 모든 년도들의 강수량에 대한 정보가 알려져 있다.
- X년도의 강수량은 Y년도의 강수량 이하이다.
- Y < Z < X를 만족하는 모든 Z들에 대해서, Z년도의 강수량은 X년도보다 적다.
위 3가지 조건을 만족하는지 여부에 따라 true, maybe, false 를 출력하는 문제였습니다.
주어지지 않은 년도가 있고, 이를 잘 가정해서 위 조건을 만족하면 maybe 입니다.
참고로 원문에 "note that the amount of rain during a year can be any nonnegative integer, the limitation on ri is just a limitation on the input" 라는 내용이 있다고 합니다. 강수량이 0 일 수도 있는 것 같습니다. (사실 저는 강수량 0 인 경우를 생각 안했는데 accepted 받았습니다... )
풀이과정은 다음과 같습니다.
(1) <년도, 강수량> 을 pair 로 벡터에 저장해 둡니다.
(2) 벡터를 둘러보며 시작년도, 끝년도 강수량과 그 중간의 강수량의 최대값을 각각 체크해두고, 중간에 빠진 년도가 있는지(maybe 여부 판단) 체크합니다.
(3) 저는 1. 애초에 조건을 만족안하는 경우, 2. 시작,끝년도가 연속된 년도인지, 3. 시작이나 끝 년도의 값이 최소 강수량 (1이라고 생각했습니다...)인 경우, 4. 모르는 값이 잇는경우, 5. 중간에 빠진 년도가 있는경우 로 나누어 모든 경우를 일일히 따져주었습니다.
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
#include <bits/stdc++.h> | |
using namespace std; | |
#define pii pair<int, int> | |
const int MAX = 1<<16; | |
const int INF = 1000000000; | |
int N, M; | |
vector<pii> arr; | |
int main(){ios_base::sync_with_stdio(false); cout.tie(NULL); cin.tie(NULL); | |
cin >> N; | |
for (int i = 0; i < N; ++i){ | |
int y, r; | |
cin >> y >> r; | |
arr.push_back(pii(y,r)); | |
} | |
cin>>M; | |
for (int i = 0; i < M; ++i){ | |
int y, x; | |
int Y = -1; | |
int X = -2; | |
// 중간 년도 값들의 최대 저장 | |
int Between = -1; | |
bool ValueY = false; | |
bool ValueX = false; | |
// 모든 년도 값들이 다 있는지 체크 | |
bool NOTALL = false; | |
int cnt = 0; | |
cin >> y >> x; | |
for (int j = 0; j < arr.size(); ++j){ | |
if(arr[j].first < y) continue; | |
else if(arr[j].first == y){ | |
Y = arr[j].second; | |
ValueY = true; | |
} | |
else if(arr[j].first > y && arr[j].first < x){ | |
Between = max(Between,arr[j].second); | |
cnt++; | |
} | |
else if(arr[j].first == x){ | |
X = arr[j].second; | |
ValueX = true; | |
break; | |
} | |
else break; | |
} | |
if(cnt<x-y-1) NOTALL = true; | |
// 애초에 조건 만족 안하는 경우 | |
if((ValueX&&Between>=X) || (ValueY&&Between>=Y) || (ValueX&&ValueY&&X>Y)){ | |
cout << "false" << '\n'; | |
continue; | |
} | |
// x,y 가 연속된 년도인 경우 | |
if(y+1==x){ | |
// X==Y==1 인 경우도 걸러짐..! | |
if(ValueX&&ValueY) cout << "true" << '\n'; | |
else cout << "maybe" << '\n'; | |
continue; | |
} | |
// 아래는 x,y 가 연속되지 않은 경우만 남음 | |
// x나 y년도 값이 1(최소) 인경우 | |
if(X==1 || Y==1){ | |
cout << "false" << '\n'; | |
continue; | |
} | |
// 모르는 값이 있는 경우 | |
if(NOTALL||!ValueX||!ValueY){ | |
cout << "maybe" << '\n'; | |
continue; | |
} | |
// 중간에 빠진 년도 있는경우 | |
if(NOTALL){ | |
cout << "maybe" << '\n'; | |
continue; | |
} | |
cout << "true" << '\n'; | |
} | |
return 0; | |
} |
댓글
댓글 쓰기
긴 글 읽어주셔서 감사합니다.
궁금한게 있으시다면 댓글 달아주세요!