✔ View
문제 분석하기
왼쪽 두 칸, 오른쪽 두 칸의 건물 중 가장 큰 높이를 구한 후, 그 값보다 현재 건물의 높이가 더 클 때 조망권을 확보할 수 있음
손으로 풀어보기
- 건물의 개수만큼 배열에 건물을 저장
- 현재 건물의 왼쪽 두 칸, 오른쪽 두 칸 중 가장 큰 건물의 높이 값을 구함
- 현재 건물의 높이가 가장 큰 높이의 값보다 크다면 조망권을 확보할 수 있으므로
가장 큰 높이의 값보다 큰만큼 조망권을 획득할 수 있는 세대 수 증가 - 세대 수 반환
슈도코드 작성하기
T(테스트 케이스 수) = 10
for(T만큼) {
N(건물의 개수)
building(건물 높이 저장 배열 (N만큼))
for(i -> n만큼) {
building[i] = 건물의 높이
}
count(조망권 확보 세대 수) = 0
for(i -> 2 ~ N - 2만큼) {
max(왼쪽 두 칸, 오른쪽 두 칸의 건물 중 가장 큰 높이)
if(현재 건물의 높이가 가장 큰 높이의 값보다 크다면) {
가장 큰 높이의 값보다 큰만큼 조망권을 획득할 수 있는 세대 수 증가
}
}
#T와 count 반환
}
코드 구현하기
/**
* 1206) View
*/
public class D002_1206 {
public static void main(String args[]) throws Exception {
Scanner sc = new Scanner(System.in);
// T(테스트 케이스 수) = 10
int T = 10;
// T만큼
for (int test_case = 1; test_case <= T; test_case++) {
// N(건물의 개수)
int N = sc.nextInt();
// building(건물 높이 저장 배열 (N만큼))
int[] building = new int[N];
// 빌딩의 높이 저장
for (int i = 0; i < N; i++) {
// building[i] = 건물의 높이
building[i] = sc.nextInt();
}
// count(조망권 확보 세대 수) = 0
int count = 0;
for (int i = 2; i < N - 2; i++) {
// max(왼쪽 두 칸, 오른쪽 두 칸의 건물 중 가장 큰 높이)
int max = Math.max(building[i - 2], Math.max(building[i - 1],
Math.max(building[i + 1], building[i + 2])));
// 현재 건물의 높이가 가장 큰 높이의 값보다 크다면
if (building[i] > max) {
// 가장 큰 높이의 값보다 큰만큼 조망권을 획득할 수 있는 세대 수 증가
count += building[i] - max;
}
}
// #T와 count 반환
System.out.println("#" + test_case + " " + count);
}
}
}
'Coding Test > Java 알고리즘 실전' 카테고리의 다른 글
[1209] Sum (0) | 2023.11.14 |
---|---|
[1208] Flatten (0) | 2023.11.13 |
[1204] 최빈수 구하기 (0) | 2023.11.12 |
[42628] 이중우선순위큐 (0) | 2023.11.11 |
[42586] 기능개발 (0) | 2023.11.11 |