https://www.acmicpc.net/problem/1027
/**
* 1027_고층 건물
*
* 처음 생각)
* N의 숫자가 작으므로 N번을 돌며 모든 건물을 기준으로 탐색한다.
* 해당 index의 건물 기준으로 왼쪽과 오른쪽 건물을 따로 생각한다.
* 왼쪽의 경우 해당 index의 index-1 번째 건물은 무조건 보이고 그 건물과의 기울기를 저장한다.
* 그리고 0번까지 왼쪽건물과 index의 건물의 기울기를 구하고 저장된 기울기와 비교한다.
* 이 때, 기울기가 작아져야 보이는 건물이다.
* 오른쪽의 경우 왼쪽과 마찬가지로 구한다. 하지만 기울기가 커져야 보이는 건물이다.
*
* 왼쪽 건물은 비교할 필요가 없었다.
* 해당 index의 오른쪽 건물들이 보인다면 보이는 건물들 또한 index의 건물이 보인다.
* 즉, 서로 건물이 보인다.
* 따라서 오른쪽의 건물들만 생각한다.
*
* index 0번부터 오른쪽으로 가면서 보이는 건물이 있을 때마다 해당 index 값을 하나씩 더해준다.
* 이 때 보이는 건물들도 1을 더해준다.
*
* 오른쪽만 생각하기로 했으므로 0번부터 시작할 때 당연히 오른쪽 건물은 무조건 보인다.
* 그래서 해당 index의 건물, 바로 오른쪽 건물의 값을 1씩 늘려준다.
* 그 후 해당 index+2번부터 탐색을 시작한다.
*/
public class P_1027 {
static int N;
static int[] buildings; // 건물들 높이
static int[] answer; // 보이는 건물의 개수
public static void main(String[] args) throws IOException {
BufferedReader br = new BufferedReader(new InputStreamReader(System.in));
N = Integer.parseInt(br.readLine());
buildings = new int[N];
answer = new int[N];
StringTokenizer st = new StringTokenizer(br.readLine(), " ");
for (int i = 0; i < N; i++) {
buildings[i] = Integer.parseInt(st.nextToken());
}
for (int i = 0; i < N-1; i++) {
// 해당 index 오른쪽 건물은 무조건 보이므로 +1
answer[i]++;
// 해당 index 오른쪽 건물은 해당 index 건물이 보이므로 +1
answer[i+1]++;
// 기울기 저장(이 기울기보다 증가해야 보이는 건물이다)
double slope = buildings[i+1] - buildings[i];
// 해당 index+2부터 오른쪽으로만 탐색 시작
for (int j = i+2; j < N; j++) {
double nextSlope = calculate(i, j);
if (nextSlope > slope) {
slope = nextSlope;
answer[i]++;
answer[j]++;
}
}
}
int max = Integer.MIN_VALUE;
for (int i = 0; i < answer.length; i++) {
max = Math.max(max, answer[i]);
}
System.out.println(max);
}
static double calculate(int i, int j) {
return (double) (buildings[j]-buildings[i]) / (j - i);
}
}