일 | 월 | 화 | 수 | 목 | 금 | 토 |
---|---|---|---|---|---|---|
1 | 2 | 3 | 4 | 5 | ||
6 | 7 | 8 | 9 | 10 | 11 | 12 |
13 | 14 | 15 | 16 | 17 | 18 | 19 |
20 | 21 | 22 | 23 | 24 | 25 | 26 |
27 | 28 | 29 | 30 |
- 백준 2133
- 백준
- TDD란?
- WebRTC란
- 구슬탈출
- 13459
- 적두트리
- 9996
- 1796
- REACT
- 2623
- stl
- mediastream
- 구현
- 테스트주도개발
- 페이지교체알고리즘
- LOLIN D32
- 자료구조
- OpenVidu
- ESP32
- dp
- RBT
- c++
- 3XN 타일링
- TDD
- 풀이
- tfjs
- 데이터 링크 계층
- Vite 사용 이유
- 메모리계층
- Today
- Total
그냥 블로그
[C++/백준] 고층 건물 본문
1027번: 고층 건물
세준시에는 고층 빌딩이 많다. 세준시의 서민 김지민은 가장 많은 고층 빌딩이 보이는 고층 빌딩을 찾으려고 한다. 빌딩은 총 N개가 있는데, 빌딩은 선분으로 나타낸다. i번째 빌딩 (1부터 시작)
www.acmicpc.net
[문제]
요약하면, 빌딩들이 있고 그 빌딩에서 다른 빌딩이 보이는가 이다.
(지붕을 이었을 때, 다른 빌딩으로 가로막혀 있거나 다른 빌딩이 선분 위의 점이면 안됨..)
[문제 풀이]
문제를 보고 딱 떠오른게 기울기로 푸는 거다
문제의 조건인, "지붕을 이었을 때, 다른 빌딩에 닿으면 안된다" 라는 조건에서 각도를 생각할 수 있었는데,
해당 조건에 걸리지 않으려면
처음을 기준으로 쳤을 때 위의 그림처럼 앞선 빌딩들 보다 이루는 각이 크면 된다 ㅇㅇ 이건 작을 때도 적용된다.
각도가 크다는건 => 기울기가 크다는 거니까,
건물 사이를 x좌표, 높이를 y좌표로 두면 기울기를 구할 수 있고,
첫 번째 건물부터 기준을 두고 뒤의 빌딩들 사이에서 앞선 최대 기울기보다 큰 기울기를 가진 건물을 찾아내면 되는거다.
y를 ( 기준건물 - 다른 건물 ) 로 두면, 나보다 낮을 때는 기울기가 -, 클 때는 +가 되고
낮을 경우에도 똑같이 큰가?를 조건으로 구할 수 있게 된다.
그 다음으로 빌딩들을 돌아가면서 찾아주는데, 기준 건물에서 보이는 건물은 보이는 건물에서도 기준 건물이 보인다는 의미이기도 하기 때문에 동시에 수를 추가해주면 된다.
[전체 코드]
#include<iostream>
#include<algorithm>
using namespace std;
#define INF 1e9;
int N;
long double height[52];
long long view[52];
long long ans = 0;
int find_view(int n) {
long double now = -INF;
for (int i = n+1; i < N; i++) {
long double h = (height[i] - height[n]) / (i - n);
// long double h = (static_cast<long double>(height[i]) - height[n]) / (i - n);
if (now < h) {
view[i]++;
view[n]++;
now = h;
}
}
ans = max(ans, view[n]);
return 0;
}
int main() {
cin >> N;
for (int i = 0; i < N; i++) {
cin >> height[i];
}
fill(view, view + N, 0);
for (int i = 0; i < N; i++) {
find_view(i);
}
cout << ans;
}
[++추가 및 고찰]
여전히 형변환이 좀 어려운데 문제를 풀면서 실패가 떴었다. 그 이유가 형변환 때문이었음.
이 부분에서, height의 자료형을 long long으로 해줬었는데 그렇다보니 계산 과정에서 손실이 일어났다고 한다.
long double h = (long long)/int 이렇게 되니까, 내부에서 long long/ int 로 계산하는 과정에서 소수점 손실이 한 번 일어나고, h에 들어간 것 같다.
그래서 height의 자료형을 long double로 바꿔주거나 static_cast<long double>을 붙여서 진행해 주면 된다고 한다.
솔직히 IDE를 써서 알았지,,, 프로그래머스에 나오는 문제였으면 풀지 못했을 것 같다... ㅠㅠ
=> 자료형을 주의하자..!
'C++ > 백준' 카테고리의 다른 글
[ C++ / 백준 ] 1796 신기한 키보드 (0) | 2024.02.01 |
---|---|
[C++/백준] 16724 피리 부는 사나이 (1) | 2024.01.22 |
[C++/백준] 20040 사이클 게임 (1) | 2024.01.13 |
[C++/백준] 1647 도시분할계획 (1) | 2024.01.07 |
[C++/백준] 2143 두 배열의 합 (1) | 2023.12.29 |