D3를 처음 풀어봤다. 생각보다 쉬웠는데 다른 사람들의 반응도 비슷한 걸 보니, 이 문제가 유난히 쉬운 편인 듯하다.
자신을 포함한 주변 5개의 건물 중에서 자신이 제일 크면 조망권이 확보된 세대가 생긴다.
내가 사용한 풀이는,
주변 5개의 건물을 vector
에 담아 sort()
로 정렬한 뒤, 첫 번째 값(최대값)이 현재 건물의 높이와 같은지 비교했다.
사실 계속 vector
에 복사하고, 정렬하는 방식이 마음에 들지는 않았지만, 5개씩 처리하기 때문에 시간 복잡도에서 큰 문제가 될 것 같지는 않았다.
비슷한 방식으로 슬라이딩 윈도우를 사용할 수도 있을 것 같다.
근데 ~~ 이번 문제처럼 단순히 5개 중에서 최대값을 찾는 거라면, max
를 이용해 한 번씩 계속 비교해도 상관없을거같다!
#include <iostream>
#include<vector>
#include<algorithm>
using namespace std;
int main()
{
int N, answer, i;
vector<int> building;
vector<int> subset(5);
for( int num=1; num<=10;num++){
cin>>N;
building.clear();
building.resize(N,0);
for(i=0;i<N;i++){
cin>>building[i];
}
if(N==4) answer=0;
else{
answer=0;
for(i=4;i<N;i++){
subset.clear();
subset.resize(5,0);
copy(building.begin()+i-4,building.begin()+i+1,subset.begin());
sort(subset.begin(),subset.end(),greater<int>());
if(subset[0]==building[i-2]){
answer+=subset[0]-subset[1];
}
}
}
cout<<"#"<<num<<" "<<answer<<endl;
}
return 0;
}