본문으로 바로가기

[BaekJoon] 백준- 고층 건물 (Java)

category 알고리즘/백준 2022. 6. 21. 09:45

문제

세준시에는 고층 빌딩이 많다. 세준시의 서민 김지민은 가장 많은 고층 빌딩이 보이는 고층 빌딩을 찾으려고 한다. 빌딩은 총 N개가 있는데, 빌딩은 선분으로 나타낸다. i번째 빌딩 (1부터 시작)은 (i,0)부터 (i,높이)의 선분으로 나타낼 수 있다. 고층 빌딩 A에서 다른 고층 빌딩 B가 볼 수 있는 빌딩이 되려면, 두 지붕을 잇는 선분이 A와 B를 제외한 다른 고층 빌딩을 지나거나 접하지 않아야 한다. 가장 많은 고층 빌딩이 보이는 빌딩을 구하고, 거기서 보이는 빌딩의 수를 출력하는 프로그램을 작성하시오.

입력

첫째 줄에 빌딩의 수 N이 주어진다. N은 50보다 작거나 같은 자연수이다. 둘째 줄에 1번 빌딩부터 그 높이가 주어진다. 높이는 1,000,000,000보다 작거나 같은 자연수이다.

출력

첫째 줄에 문제의 정답을 출력한다.

 

 

 

풀이:

처음에는 단순히 높은 건물이 있는지 여부만을 체크했었다

 

ccw 라는 알고리즘 으로 풀 수 있는 문제라곤 하는데 복잡해보여서 일단 기울기로 풀었다. 

 

두 빌딩 사이의 기울기 = ( 기준 빌딩 높이 - 상대 빌딩 높이 ) / ( 기준 빌딩 x좌표 - 상대 빌딩 x 좌표 )

 

왼쪽의 빌딩을 바라볼 경우, 

 

기준 빌딩이 높은 경우와 낮은 경우를 그림으로 그려보면, 기울기가 작아지는 방향으로 옆의 빌딩을 관찰할 수 있다. 

 

반대로 오른쪽 빌딩을 바라볼 경우, 

기울기가 커지는 방향이다. (그림을 그려보면 쉽다.)

 

 

 

import java.io.BufferedReader;
import java.io.IOException;
import java.io.InputStreamReader;

public class Main {
    static int N;
    static int[] Building;
    static int MAX = 0;
    
    public static void main(String[] args) throws IOException {
        BufferedReader br = new BufferedReader(new InputStreamReader(System.in));
        N = Integer.parseInt(br.readLine());
        
        Building = new int[N];
        String[] input = br.readLine().split(" ");
        
        for(int i = 0; i<N; i++) {
            Building[i] = Integer.parseInt(input[i]);
        }
        
        
        
        for(int i = 0; i<N; i++) {
            int count = 0;
            double prev = 0L;
            
            for(int j = i-1; j >= 0; j--) {
                double tmp = (double)(Building[j] - Building[i]) / (double)(j - i);
                
                if (prev > tmp || j == i-1) {
                    count++;
                    prev = tmp;
                }
                
            }
    
            prev = 0;
            
            for(int j = i+1; j<N; j++) {
                double tmp = (double)(Building[j] - Building[i]) / (double)(j - i);
    
                if (prev < tmp || j == i+1) {
                    count++;
                    prev = tmp;
                }
            }
            MAX = Math.max(count, MAX);
        }
    
        System.out.println(MAX);
    }
}

'알고리즘 > 백준' 카테고리의 다른 글

[BaekJoon] 백준 - 나무 재테크  (0) 2022.06.27
[BaekJoon] 백준 - 게리맨더링 2  (0) 2022.06.23
[BaekJoon] 백준 - 단지번호붙이기  (0) 2022.06.16
[BaekJoon] 백준 - 미로 탐색  (0) 2022.06.16
[BaekJoon] 백준 - 빙산  (0) 2022.06.15