울타리 문제 시간초과

  • moon1288
    moon1288

    안녕하세요

    이번에 울타리 문제를 풀면서

    java를 이용해서 시도중인데요

    시간 초과가 나서 이리저리 보아도

    왜 그런지 이해가 안되어서 질문 올렸습니다.

    기본적으로 분할 정복을 해서 max값을 선택하도록 했습니다.

    별다른 loop에 빠질 일도 없어보이는데,

    도움 부탁드립니다.

    import java.util.Scanner;

    class Main
    {
    static int[] pannels = new int[20001];

    public static void main(String args[])
    {
        Scanner sc = new Scanner(System.in);
        int T;
        T=sc.nextInt();
    
        for(int test_case = 1; test_case <= T; test_case++)
        {
            int N; // 판자의 수
            N=sc.nextInt();
    
            for(int i=0;i<N;i++)
            {
                pannels[i] = sc.nextInt();
            }
    
            System.out.println(calc(0, N-1));
    
            // 최대 직사각형의 크기
            //System.out.println(test_case);
        }
    }
    static int  calc(int start, int end)
    {
        int left, right;
        if(end-start == 0) {
            return pannels[start];
        }
        int split_point = (start+end)/2;
        left = calc(start, split_point);
        right = calc(split_point+1, end);
    
        //이어지는 부분을 경계로 넓은 영역을 찾아본다.
        int split_point_max;
        if(pannels[split_point] < pannels[split_point+1]) {
            split_point_max = pannels[split_point];
        }
        else{
            split_point_max = pannels[split_point+1];
        }
    
        int max = 0;
        for(int i=split_point_max;i>0;i--){ // 높은 부분부터 찾아본다.
            int left_count = 0;
            int right_count = 0;
            int point;
            //왼쪽
            point = split_point;
            //System.out.println("split_point : " + split_point);
            while(point >= start && pannels[point--] >= i) left_count++;
            //System.out.println(left_count);
            //오른쪽
            point = split_point+1;
            while(point <= end && pannels[point++] >= i) right_count++;
            //System.out.println(right_count);
    
            int area = i * (left_count+right_count);
            //System.out.println(i + " " + left_count + " " + right_count);
            if(area > max) max = area;
        }
        int left_right_max;
    
        if(left < right)
            left_right_max = right;
        else
            left_right_max = left;
    
        if(left_right_max > max)
            return left_right_max;
        else
            return max;
    }

    }


    8년 전
0개의 댓글이 있습니다.
  • 정회원 권한이 있어야 커멘트를 다실 수 있습니다. 정회원이 되시려면 온라인 저지에서 5문제 이상을 푸시고, 가입 후 7일 이상이 지나셔야 합니다. 현재 문제를 푸셨습니다.