알고리즘/SW Expert Academy

1206. [S/W 문제해결 기본] 1일차 - View

문제 정보: 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);
    }
}