Programming/JavaScript

[백준/JavaScript] 고층 건물(1027)

코딩뽀시래기 2024. 7. 13. 14:27
728x90

문제

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

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

 

[ 입력 ]

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

 

[ 출력 ]

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

 

 

풀이

  • 왼쪽과 오른쪽을 나누고, 빌딩 지붕끼리 이은 기울기로 판단
// 백준 - 고층 건물(1027)
const solution = ( input ) => {
  const N = parseInt(input.shift());
  const building = input.shift().split(' ').map((o) => parseInt(o));
  let answer = 0;

  for(let i = 0; i < N; i++) {
    let cnt = 0;
    
    // 왼쪽
    let min = Infinity;
    for(let j = i - 1; j >= 0; j--){
      let temp = (building[j] - building[i]) / (j - i);
      if(min > temp) {
        cnt++;
        min = temp;
      }
    }
    // 오른쪽
    let max = -Infinity;
    for(let j = i + 1; j < N; j++) {
      let temp = (building[j] - building[i]) / (j - i);
      if(max < temp) {
        cnt++;
        max = temp;
      }
    }

    if(answer < cnt) answer = cnt;
  }

  console.log(answer);
}

/*
테스트용: __dirname + '/input.txt'
제출용: '/dev/stdin'
*/
const fs = require('fs');
const input = fs.readFileSync('/dev/stdin').toString().split('\n');

solution(input);
728x90