울타리 문제 시간초과 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일 이상이 지나셔야 합니다. 현재 문제를 푸셨습니다.
moon1288
안녕하세요
이번에 울타리 문제를 풀면서
java를 이용해서 시도중인데요
시간 초과가 나서 이리저리 보아도
왜 그런지 이해가 안되어서 질문 올렸습니다.
기본적으로 분할 정복을 해서 max값을 선택하도록 했습니다.
별다른 loop에 빠질 일도 없어보이는데,
도움 부탁드립니다.
import java.util.Scanner;
class Main
{
static int[] pannels = new int[20001];
}
8년 전