A, B, C 빌딩이 있을 때, A에서 C가 보이려면 B가 A와 C를 잇는 선분에 접하거나 겹치면 안된다.
그렇다면 이 선분을 어떻게 표현하고, 선분에 접하거나 겹치는지 어떻게 알 수 있을까?
A-C를 잇는 선분의 기울기 = (A 높이 - C 높이) / A-C 거리
A와 C 사이의 기울기를 이렇게 정의한다면, 동일하게 A와 B 사이의 기울기를 계산할 수 있다.

그리고 A-C 기울기가 A-B 기울기보다 작다면, A-C를 잇는 선분이 A-B를 잇는 선분보다 위에 존재하기 때문에 "보인다"라고 할 수 있다.
이제 보이는지 안보이는지를 알 수 있게 되었으므로, 가까운 건물부터 먼건물 순으로 기울기를 확인하면서 기울기가 내림차순이 되는 건물의 숫자를 확인하면 된다.
건물의 수 N이 50으로 매우 작기 때문에 모든 건물에 대해 비교를 수행하면 된다.
import java.util.*;
import java.io.*;
public class Main {
public static void main(String[] args) throws IOException {
BufferedReader in = new BufferedReader(new InputStreamReader(System.in));
input(in);
solve();
}
static int nBuilding;
static int[] height;
static void input(BufferedReader in) throws IOException {
nBuilding = Integer.parseInt(in.readLine());
height = new int[nBuilding];
StringTokenizer tokens = new StringTokenizer(in.readLine());
for(int i = 0; i < nBuilding; i++) {
height[i] = Integer.parseInt(tokens.nextToken());
}
}
static void solve() {
int max = 0;
for(int i = 0; i < nBuilding; i++) {
int cur = height[i];
int cnt = 0;
double prev = Double.MAX_VALUE;
for(int j = i-1; j >= 0; j--) {
double dist = i - j;
double tilt = (cur - height[j])/dist;
if(tilt < prev) {
prev = tilt;
cnt++;
}
}
prev = Double.MAX_VALUE;
for(int j = i+1; j < nBuilding; j++) {
double dist = j - i;
double tilt = (cur - height[j])/dist;
if(tilt < prev) {
prev = tilt;
cnt++;
}
}
max = Math.max(max, cnt);
}
System.out.println(max);
}
}