본문 바로가기
코딩테스트

[백준] 1027번 '고층 건물' - Java

by CuckooBird 2023. 7. 26.

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

 

1027번: 고층 건물

세준시에는 고층 빌딩이 많다. 세준시의 서민 김지민은 가장 많은 고층 빌딩이 보이는 고층 빌딩을 찾으려고 한다. 빌딩은 총 N개가 있는데, 빌딩은 선분으로 나타낸다. i번째 빌딩 (1부터 시작)

www.acmicpc.net


문제


코드

import java.io.*;
import java.util.*;

public class Main {
	private static final BufferedReader bf = new BufferedReader(new InputStreamReader(System.in));
	private static final BufferedWriter bw = new BufferedWriter(new OutputStreamWriter(System.out));
	
	public static void main(String[] args) throws IOException {
		int n = Integer.parseInt(bf.readLine());
		
		StringTokenizer st = new StringTokenizer(bf.readLine());
		int[] tower = new int[n];
		for(int i = 0 ; i < n ; i++) {
			tower[i] = Integer.parseInt(st.nextToken());
		}
		
		int ans = 0;
		for(int i = 0 ; i < n ; i++) {
			int cnt = 0;
			
            // 왼쪽 그래프 탐색 : max_l 보다 기울기가 작거나 같다면 건물을 지나치거나 겹칩
			double max_l = 1_000_000_000;
			for(int j = i-1 ; j >= 0 ; j--) {
				double l = (tower[i]-tower[j]) / ((double)i - (double)j);
				if(l < max_l) {
					cnt ++;
					max_l = l;
				}
			}
			
            // 오른쪽 그래프 탐색 : min_l 보다 기울기가 크거나 같다면 건물을 지나치거나 겹칩
			double min_l = -1_000_000_000;
			for(int j = i+1 ; j < n ; j++) {
				double l = (tower[i]-tower[j]) / ((double)i - (double)j);
				if(l > min_l) {
					cnt ++;
					min_l = l;
				}
			}
			
			ans = Math.max(ans, cnt);
		}
		
		bw.write(Integer.toString(ans));
		
		bf.close();
		bw.flush();
		bw.close();
	}
}