Rev Notebook

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

by Rev_

 

SW Expert Academy

SW 프로그래밍 역량 강화에 도움이 되는 다양한 학습 컨텐츠를 확인하세요!

swexpertacademy.com

첫 번째 D3 문제라 살짝 긴장했는데(?) 생각보다 어렵진 않았다.

배열을 만들어서 앞 뒤 2칸씩의 값을 검증하기만 하면 되는 문제였다.

 

풀이

import java.io.BufferedReader;
import java.io.IOException;
import java.io.InputStreamReader;

public class S_1206 {
    static int[] height;
    // View
    public static void main(String[] args) throws IOException {
        BufferedReader br = new BufferedReader(new InputStreamReader(System.in));
        for (int i = 0; i < 10; i++) { // test case

            int n = Integer.parseInt(br.readLine()); // 건물의 개수
            String s = br.readLine();
            String[] arr = s.split(" "); // 건물 높이 배열
            height = new int[n];
            for (int j = 0; j < n; j++) {
                height[j] = Integer.parseInt(arr[j]);
            }

            int res = 0;
            for (int j = 2; j < n - 2; j++) {
                res += view(j);
            }
            System.out.println("#" + (i+1) + " " + res);
        }
    }

    static int view(int i) {
        int a = height[i-2];
        int b = height[i-1];
        int c = height[i+1];
        int d = height[i+2];

        if (height[i] <= a || height[i] <= b || height[i] <= c || height[i] <= d) {
            return 0;
        }

        int max = Math.max(Math.max(Math.max(a, b), c), d);
        return height[i] - max;

    }
}

배열을 돌며 해당 빌딩이 조망권이 확보 되어 있는지 검증하는 함수 view()를 구현하였다.

view 함수를 살펴보도록 하자.

int a = height[i-2];
int b = height[i-1];
int c = height[i+1];
int d = height[i+2];

if (height[i] <= a || height[i] <= b || height[i] <= c || height[i] <= d) {
    return 0;
}

일단 조망권이 되려면? 앞과 뒤 2칸에서 자기보다 큰 빌딩이 하나도 없어야 한다.

기준이 되는 빌딩 근처 2칸에 더 큰 빌딩이 있다면, 해당 빌딩은 조망권이 없기 때문에 0을 반환한다.

int max = Math.max(Math.max(Math.max(a, b), c), d);
return height[i] - max;

위의 if문을 통과한 빌딩은 근처 2칸 이내 제일 큰 빌딩이다.

그럼 이제 조망권을 몇 세대 확보할 수 있는지 구해야할 것이다. 우리가 앞서 본 4개의 근처 빌딩들 중에서 가장 높은 빌딩의 높이를 뺀 값이 조망권을 확보한 세대수 일 것이다.

int res = 0;
for (int j = 2; j < n - 2; j++) {
    res += view(j);
}
System.out.println("#" + (i+1) + " " + res);

그 값을 반환해준 후 main문에서 값을 계속 더해나간다!

그러면 값을 구할 수 있다.

 

처음에 건물의 개수를 입력하는 n이 맨 앞과 뒤 0 0 값을 포함하는건지 모르고.... 배열을 n+4의 크기로 생각하고 계산했다가 계속 인덱스 오류가 났다😇 하하... 그냥 건물의 개수 n = 입력되는 값의 개수 라고 생각하면 될 것 같다.

블로그의 정보

Hi Rev

Rev_

활동하기