본문 바로가기
코딩테스트

울타리 잘라내기 (문제 ID: FENCE, 난이도: 중)

by Luigi.yoon 2023. 8. 4.

문제 : https://algospot.com/judge/problem/read/FENCE

 

algospot.com :: FENCE

울타리 잘라내기 문제 정보 문제 너비가 같은 N개의 나무 판자를 붙여 세운 울타리가 있습니다. 시간이 지남에 따라 판자들이 부러지거나 망가져 높이가 다 달라진 관계로 울타리를 통째로 교체

algospot.com

 

 

 

예제 입력

3
7
7 1 5 9 6 7 3
7
1 4 4 4 4 1 1
4
1 8 2 2

예제 출력

20
16
8

 

 

public static void main(String[] args) {
    int fenceCount = 7;
    int[] fenceHeight = {7, 1, 5, 9, 6, 7, 3};
    System.out.println(getMaxRectangle(fenceHeight, 0, fenceCount-1)); // 20

    fenceCount = 7;
    fenceHeight = new int[]{ 1, 4, 4, 4, 4, 1, 1 };
    System.out.println(getMaxRectangle(fenceHeight, 0, fenceCount-1)); // 16

    fenceCount = 4;
    fenceHeight = new int[]{ 1, 8, 2, 2 };
    System.out.println(getMaxRectangle(fenceHeight, 0, fenceCount-1)); // 8
}

public static int getMaxRectangle(int[] fenceHeight, int left, int right) {
    // 기저 사례 : 판자가 하나인 경우
    if(left == right) {
        return fenceHeight[left];
    }

    // 분할 기준점 mid 를 중심으로 [left <-> mid],  [mid+1 <-> right] 두 구간으로 분할한다.
    int mid = (left + right) / 2;

    // 분할한 문제를 각개격파
    int maxRectangle = Math.max(getMaxRectangle(fenceHeight, left, mid), getMaxRectangle(fenceHeight, mid+1, right));

    int lo = mid, hi = mid + 1;

    // [mid, mid + 1]만 포함하는 너비 2인 사각형을 고려한다.
    int height = Math.min(fenceHeight[lo], fenceHeight[hi]);
    maxRectangle = Math.max(maxRectangle, height * 2);

    // mid 에서 출발한 lo, hi 가 각각 왼쪽, 오른쪽으로 사각형이 입력 전체를 덮을 때까지 확장해 나간다.
    while(left < lo || hi < right) {
        // 항상 높이가 더 높은 쪽으로 확장한다.
        if(left < lo && (hi == right || fenceHeight[lo - 1] > fenceHeight[hi + 1])) {
            --lo;
            height = Math.min(height, fenceHeight[lo]);
        } else {
            ++hi;
            height = Math.min(height, fenceHeight[hi]);
        }
        // 확장한 후 사각형의 넓이
        maxRectangle = Math.max(maxRectangle, height * (hi - lo + 1));
    }


    return maxRectangle;
}

'코딩테스트' 카테고리의 다른 글

문자열 정수의 합  (0) 2023.07.19
코딩테스트 도움사이트  (0) 2023.07.19