Tech/Algorithm
[BOJ] 백준 1027 고층건물 c++ (브루트포스, 기하학)
0m1n
2023. 1. 4. 12:52
728x90
반응형
문제 출처 : https://www.acmicpc.net/problem/1027
1027번: 고층 건물
세준시에는 고층 빌딩이 많다. 세준시의 서민 김지민은 가장 많은 고층 빌딩이 보이는 고층 빌딩을 찾으려고 한다. 빌딩은 총 N개가 있는데, 빌딩은 선분으로 나타낸다. i번째 빌딩 (1부터 시작)
www.acmicpc.net
풀이
고층 빌딩 리스트가 주어지는데, 가장 많은 빌딩이 보이는 수를 출력하는 문제이다.
이때 A에서 B빌딩이 보이려면 두 지붕을 잇는 선분이 A와 B를 제외한 다른 고층 빌딩을 지나거나 접하지 않아야 한다.
처음에 두 선분을 구하고 사이에 있는 빌딩의 높이가 그 선분을 건드리는지 확인해봐야하나 고민했지만, 결론은 기울기였다.
2중 for문을 돌며 모든 빌딩과 다른 빌딩을 확인해 해당 빌딩과 기준 빌딩의 기울기가 최고 기울기보다 크면 보이는 경우로 판단한다.
기울기 계산
y 증가량을 x증가량으로 나눈 공식을 쓰면 된다.
building 배열은 높이를 저장하고 기준 빌딩이 i, 확인할 빌딩이 j라고 했을때 공식은 아래와 같다.
double level = (double)(building[j] - building[i]) / (j - i);
2중 for문 돌며 확인 및 최고 기울기 갱신
초기 기울기는 최소값으로 놓고, 2중 for문을 돌며 기울기를 확인한다.
해당 기울기가 최고 기울기보다 크면 두 빌딩에 보이는 빌딩 수를 1 증가시키고, 최고 기울기를 갱신한다.
// building[] : 빌딩 높이
// cnt[] : 보이는 빌딩 수
for(int i = 0; i < N; i++){
double max_level = -9999999999;
for(int j = i + 1; j < N; j++){
double level = (double)(building[j] - building[i]) / (j - i);
if(level > max_level){
cnt[i]++;
cnt[j]++;
max_level = level;
}
}
}
코드
#include <bits/stdc++.h>
using namespace std;
int res;
int main(void) {
ios::sync_with_stdio(false); cin.tie(NULL);
int N;
cin >> N;
vector<int> building(N);
vector<int> cnt(N, 0);
for(int i = 0; i < N; i++)
cin >> building[i];
for(int i = 0; i < N; i++){
double max_level = -9999999999;
for(int j = i + 1; j < N; j++){
double level = (double)(building[j] - building[i]) / (j - i);
if(level > max_level){
cnt[i]++;
cnt[j]++;
max_level = level;
}
}
}
for(auto elem : cnt)
res = max(res, elem);
cout << res << '\n';
return 0;
}
728x90
반응형