문제 정보: 1206. [S/W 문제 해결 기본] 1일 차 - View
강변에 빌딩들이 옆으로 빽빽하게 밀집한 지역이 있다.
이곳에서는 빌딩들이 너무 좌우로 밀집하여, 강에 대한 조망은 모든 세대에서 좋지만 왼쪽 또는 오른쪽 창문을 열었을 때 바로 앞에 옆 건물이 보이는 경우가 허다하였다.
그래서 이 지역에서는 왼쪽과 오른쪽으로 창문을 열었을 때, 양쪽 모두 거리 2 이상의 공간이 확보될 때 조망권이 확보된다고 말한다.
빌딩들에 대한 정보가 주어질 때, 조망권이 확보된 세대의 수를 반환하는 프로그램을 작성하시오.
[제약 사항]
가로 길이는 항상 1000 이하로 주어진다.
맨 왼쪽 두 칸과 맨 오른쪽 두 칸에는 건물이 지어지지 않는다. (예시에서 빨간색 땅 부분)
각 빌딩의 높이는 최대 255이다.
[입력]
입력 파일의 첫 번째 줄에는 테스트케이스의 길이가 주어진다. 그 바로 다음 줄에 테스트 케이스가 주어진다.
총 10개의 테스트케이스가 주어진다.
[출력]
#부호와 함께 테스트 케이스의 번호를 출력하고, 공백 문자 후 테스트 케이스의 조망권이 확보된 세대의 수를 출력한다.
입력 100 0 0 225 214 82 73 241 233 179 219 135 62 36 13 6 71 179 77 67 139 31 90 9 37 ... 1000 0 0 225 214 82 73 241 233 179 219 135 62 36 13 6 71 179 77 67 139 31 90 9 37 ... ... |
출력 #1 691 #2 9092 ... |
import java.util.Scanner;
public class solution_1206 {
public static void main(String[] args) {
Scanner sc = new Scanner(System.in);
for(int test_case = 1; test_case <= 10; test_case++) {
int totCnt = sc.nextInt();
int[] buildings = new int[totCnt];
for(int i = 0; i < totCnt; i++){
buildings[i] = sc.nextInt();
}
resultPrint(buildings, test_case);
}
}
public static void resultPrint (int[] buildings, int testCase){
int totSum = 0, max, maxIndex, standard;
for(int i = 2; i < buildings.length - 2; i++){
max = 0;
maxIndex = 0;
standard = buildings[i];
//양옆 2개의 빌딩 중 가장 높은 높이 구하기 (max)
for(int j = 1; j < 3; j++){
if(buildings[i+j] > max){ //기준빌딩의 오른쪽 2칸
max = buildings[i+j];
if(buildings[i] < buildings[i+j]){ //기준 빌딩보다 높은 빌딩이 존재하는 경우 그 빌딩으로 이동
maxIndex = i+j;
}
}
if(buildings[i-j] > max){ //기준빌딩의 왼쪽 2칸
max = buildings[i-j];
}
}
if(standard > buildings[i-1]
&& standard > buildings[i-2]
&& standard > buildings[i+1]
&& standard > buildings[i+2]) { //기준 빌딩이 가장 높은 경우
totSum += standard - max;
i += 2;
}else{
if(maxIndex > 0) //현재 기준점에 다음 2칸 중 높은 빌딩이 있는 경우
i = maxIndex-1; //반복문에 시작을 가장 높은 maxIndex 위치로 이동
}
}
System.out.println("#"+testCase + " " +totSum);
}
}
'알고리즘 > SW Expert Academy' 카테고리의 다른 글
1933. 간단한 N 의 약수 (0) | 2021.08.27 |
---|---|
1859. 백만 장자 프로젝트 (0) | 2021.08.25 |
1983. 조교의 성적 매기기 (0) | 2021.08.18 |
1204. [S/W 문제해결 기본] 1일차 - 최빈수 구하기 (0) | 2021.08.05 |
1984. 중간 평균값 구하기 (0) | 2021.08.05 |