백준 1027 고층 건물 JAVA

SHByun·2023년 2월 12일
0

문제

https://www.acmicpc.net/problem/1027


입출력


예제



태그

  • 수학
  • 브루트포스 알고리즘
  • 기하학

풀이

  • 왼쪽 건물은 비교할 필요가 없다.
  • 해당 index의 오른쪽 건물들이 보인다면 보이는 건물들 또한 index의 건물이 보인다.
  • 즉, 서로 건물이 보인다.
  • 따라서 오른쪽의 건물들만 생각한다.
  • index 0번부터 오른쪽으로 가면서 보이는 건물이 있을 때마다 해당 index 값을 하나씩 더해준다.
  • 이 때 보이는 건물들도 1을 더해준다.
  • 오른쪽만 생각하기로 했으므로 0번부터 시작할 때 당연히 오른쪽 건물은 무조건 보인다.
  • 그래서 해당 index의 건물, 바로 오른쪽 건물의 값을 1씩 늘려준다.
  • 그 후 해당 index+2번부터 탐색을 시작한다.

코드

정답 코드

/**
 * 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);
    }
}
profile
안녕하세요

0개의 댓글