https://www.acmicpc.net/problem/1027
1027번: 고층 건물
세준시에는 고층 빌딩이 많다. 세준시의 서민 김지민은 가장 많은 고층 빌딩이 보이는 고층 빌딩을 찾으려고 한다. 빌딩은 총 N개가 있는데, 빌딩은 선분으로 나타낸다. i번째 빌딩 (1부터 시작)
www.acmicpc.net
1. 문제 핵심
- 빌딩의 수는 최대 50개.
- 빌딩의 높이는 최대 10억보다 작거나 같은 수
2. 문제 접근
- 총 빌딩의 수가 50개밖에 되지 않아 완탐으로 한 빌딩과 그 외 나머지 빌딩을 모두 비교하면서 진행해도 괜찮다고 생각했습니다.
- [현재] 빌딩과 [비교] 빌딩 바닥 사이의 거리 / A빌딩과 B빌딩 꼭지점 사이의 거리 == 기울기 값을 구할 수 있다.
- 기준 빌딩 왼쪽, 오른쪽 각각 진행하며 각 기울기 값을 비교해서 기울기가 가장 큰 값을 저장하고 해당 기울기보다 큰 기울기가 존재할 때마다 카운트를 증가하고 저장된 기울기를 더 큰 값으로 갱신합니다.

3. 문제 후기
- 처음엔 cosΘ(밑변/빗변)값을 통해 비교했는데 원하는 값이 나오지 않아서 기울기를 통해 비교해야한다는 도움을 받았습니다.
- 또한 두 빌딩은 서로 보일 수 있기 때문에 굳이 한 빌딩에서 좌, 우로 모두 확인하지 않고, 차례대로 왼쪽에서 오른쪽으로 기준점을 옮기며 검사를 하면 시간 단축이 가능합니다.
4. 자바 코드
더보기
package _0721.ChungLee;
import java.io.IOException;
import java.io.BufferedReader;
import java.io.InputStreamReader;
import java.util.*;
class BOJ_1027_G4_고층건물 {
static int N;
static int[] building;
static int[] visible;
// 보이는 빌딩 카운팅
private static void count() {
// 빌딩이 하나인 경우는 제외하기 위해 N - 1
for (int i = 0; i < N - 1; i++) {
visible[i] += 1; // 바로 옆 건물은 무조건 보임
visible[i + 1] += 1;
//높이 차이
double slope = building[i + 1] - building[i];
//다다음 빌딩부터 비교
for (int j = i + 2; j < N; j++) {
// 기울기 계산
double nextSlope = (double) (building[j] - building[i]) / (j - i);
//이전 기울기보다 작거나 같으면 안보이는 것이기 때문에 패스
if (nextSlope <= slope)
continue;
//더 크다면 해당 기울기 저장
slope = nextSlope;
//두 빌딩은 서로 보이는 것이기 때문에 각각 ++
visible[i]++;
visible[j]++;
}
}
}
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];
// 빌딩이 보이는지 여부 저장
visible = new int[N];
StringTokenizer st = new StringTokenizer(br.readLine());
for (int i = 0; i < N; i++) {
building[i] = Integer.parseInt(st.nextToken());
}
count();
Arrays.sort(visible);
System.out.println(visible[visible.length - 1]);
}
}
5. 시간
솔루션을 참고했기 때문에 제출하지 않음.
'programming > 알고리즘' 카테고리의 다른 글
| [백준, 1113, 자바] 수영장 만들기 (0) | 2022.08.04 |
|---|---|
| [백준, 18500, 자바] 미네랄2 (0) | 2022.07.25 |
| [백준, 23791, 자바] K번째 음식 찾기 1 (0) | 2022.07.07 |
| [백준, 17780, 자바] 새로운 게임 (0) | 2022.07.07 |
| [프로그래머스, 자바] 여행경로 (0) | 2022.06.30 |
댓글