알고리즘

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

chadongmin 2023. 5. 14. 17:44

SWExpertAcademy 1206번 d3 난이도의 문제입니다.

 

문제:

 

강변에 빌딩들이 옆으로 빽빽하게 밀집한 지역이 있다.

이곳에서는 빌딩들이 너무 좌우로 밀집하여, 강에 대한 조망은 모든 세대에서 좋지만 왼쪽 또는 오른쪽 창문을 열었을 때 바로 앞에 옆 건물이 보이는 경우가 허다하였다.

그래서 이 지역에서는 왼쪽과 오른쪽으로 창문을 열었을 때, 양쪽 모두 거리 2 이상의 공간이 확보될 때 조망권이 확보된다고 말한다.

빌딩들에 대한 정보가 주어질 때, 조망권이 확보된 세대의 수를 반환하는 프로그램을 작성하시오.
 
아래와 같이 강변에 8채의 빌딩이 있을 때, 연두색으로 색칠된 여섯 세대에서는 좌우로 2칸 이상의 공백이 존재하므로 조망권이 확보된다. 따라서 답은 6이 된다.

 

 

A와 B로 표시된 세대의 경우는 왼쪽 조망은 2칸 이상 확보가 되었지만 오른쪽 조망은 한 칸 밖에 확보가 되지 않으므로 조망권을 확보하지 못하였다.

C의 경우는 반대로 오른쪽 조망은 2칸이 확보가 되었지만 왼쪽 조망이 한 칸 밖에 확보되지 않았다.
 
[제약 사항]

가로 길이는 항상 1000이하로 주어진다.

맨 왼쪽 두 칸과 맨 오른쪽 두 칸에는 건물이 지어지지 않는다. (예시에서 빨간색 땅 부분)

각 빌딩의 높이는 최대 255이다.
 
 

[입력]

총 10개의 테스트케이스가 주어진다.

각 테스트케이스의 첫 번째 줄에는 건물의 개수 N이 주어진다. (4 ≤ N ≤ 1000)

그 다음 줄에는 N개의 건물의 높이가 주어진다. (0 ≤ 각 건물의 높이 ≤ 255)

맨 왼쪽 두 칸과 맨 오른쪽 두 칸에 있는 건물은 항상 높이가 0이다. (예시에서 빨간색 땅 부분)
 
[출력]

#부호와 함께 테스트케이스의 번호를 출력하고, 공백 문자 후 조망권이 확보된 세대의 수를 출력한다
 
-------------------------------------------------------------------------------------
풀이방법 :
일단 테스트케이스는 원활한 디버깅을 위해 1로 고정해두고 했습니다.
 
static으로 b_count라는 변수를 선언했습니다. 빌딩의 개수를 입력받는 용도입니다.
 
static으로 b_height[] 배열을 선언합니다. 이 배열의 크기는 b_count입니다.
 
그리고 for문 안에서 b_height의 원소를 입력받습니다.
 
그리고 또다른 for문을 생성해야 하는데 이 for문은 조망권이 확보되는 세대를 필터링하기 위한 로직을 수행하는 for문입니다.
 
조망권이 확보되는 조건이 가장 중요한데, 기준이 되는 빌딩의 왼쪽, 왼+1, 오른쪽, 오른쪽+1 이렇게 4개의 원소가 자신보다  작아야합니다.
 
크기를 비교하는 방법으로 Math.max() 메소드를 사용했습니다.
 
 
package SWExpert;
import java.util.*;
import java.lang.*;

public class sw1206 {
   
    static int b_count;
    static int[] b_height ;
    static int max;

    public static void main(String[] args) {
        int sum = 0;
        Scanner sc = new Scanner(System.in);
        int T;
        T=10;
		/*
		   여러 개의 테스트 케이스가 주어지므로, 각각을 처리합니다.
		*/

        for(int test_case = 1; test_case <= T; test_case++)
        {
            b_count = sc.nextInt();
            b_height = new int[b_count];
            for(int i = 0;i<b_count;i++){
                b_height[i] = sc.nextInt();
            }
            for(int j = 2;j<b_count-2;j++){
                max = Math.max(b_height[j-2],Math.max(b_height[j-1], Math.max(b_height[j+1],b_height[j+2])));
                if((b_height[j]>max)) sum+=(b_height[j] - max);
            }
            System.out.println("#"+test_case+" "+sum);
            sum = 0;

            /////////////////////////////////////////////////////////////////////////////////////////////
			/*
				 이 부분에 여러분의 알고리즘 구현이 들어갑니다.
			 */
            /////////////////////////////////////////////////////////////////////////////////////////////

        }
    }
}