[BOJ] 1027 - 고층 건물
접근
가장 무식한 방법을 생각해보자. 각 건물에서 해당 건물이 보이는지 알아보기 위해 모든 건물에 대해 완전탐색을 실시해 내가 보려는 건물과 이어진 선분에 걸리는 건물이 있는지 확인하면 된다. 따라서 N x N x N=N3의 시간복잡도를 가질 것이다. 지금 다시 보니 이렇게 풀어도.. 풀릴 것 같은데.. 아무튼 조금만 더 생각해보면 현재 위치에서 각 건물까지 이은 선분의 기울기는 항상 증가(오른쪽으로 바라보는 경우)하거나 감소(왼쪽 방향으로 바라보는 경우)하게 될 것이다. 그래서 나는 현재 위치를 기준으로 두 번 봐주었는데 이 글을 쓰면서 생각해보니 왼쪽->오른쪽으로 봐준다면 기울기는 항상 증가하므로 기울기가 증가하는 경우를 세주기만 하면 된다(한번 보는데 N만큼의 시간이 걸린다) 따라서 O(N2)의 시간으로 계산할 수 있다.
소스코드
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
#include<iostream>
#include<limits.h>
#include<algorithm>
using namespace std;
typedef long long ll;
ll arr[55];
int main(void) {
ll n, ans = 0;
scanf("%lld", &n);
for (ll i = 0; i < n; i++) {
scanf("%lld", arr + i);
}
for (ll i = 0; i < n; i++) {
ll cnt = 0;
if (i > 0) {
ll x = i - 1;
cnt++;
for (ll j = i - 2; j >= 0; j--) {
if ((j - i) * (arr[x] - arr[i]) > (x - i) * (arr[j] - arr[i])) {
x = j;
cnt++;
}
}
}
if (i < n - 1) {
ll x = i + 1;
cnt++;
for (int j = i + 2; j < n; j++) {
if ((j - i) * (arr[x] - arr[i]) < (x - i)* (arr[j] - arr[i])) {
x = j;
cnt++;
}
}
}
ans = max(ans, cnt);
}
printf("%d", ans);
return 0;
}
This post is licensed under CC BY 4.0 by the author.
Comments powered by Disqus.