[문제][알고스팟] 울타리 잘라내기
2019. 1. 28. 23:10ㆍ[개발] 지식/알고리즘 문제풀이
그냥 빨리 풀어버렸다.
항상 느끼는건 내가 푸는 것에 대한 정당성 증명이 완벽하게 와닿진 않는다. 귀류법으로 증명하면 논리적으로 참이라는건 이해가 가지만 그렇다고 처음 본 문제에서 가설을 세우기가 여전히 어렵다. 다들 완벽하게 알고 정당성까지 입증하고 푸는걸까? 아직 모르겠다.
package apss;
import java.io.BufferedReader;
import java.io.BufferedWriter;
import java.io.FileInputStream;
import java.io.IOException;
import java.io.InputStreamReader;
import java.io.OutputStreamWriter;
import java.util.StringTokenizer;
public class Fence {
public static int N; // 1<= N <= 20000
public static int height[];
public static void main(String[] args) throws NumberFormatException, IOException {
// TODO Auto-generated method stub
System.setIn(new FileInputStream("D://sample_input.txt"));
BufferedReader br = new BufferedReader(new InputStreamReader(System.in));
BufferedWriter bw = new BufferedWriter(new OutputStreamWriter(System.out));
int T = Integer.parseInt(br.readLine());
for(int testCase=1; testCase<=T; testCase++) {
N = Integer.parseInt(br.readLine().trim());
StringTokenizer st = new StringTokenizer(br.readLine());
height = new int[N];
for(int i=0; i<N; i++) {
height[i] = Integer.parseInt(st.nextToken());
}
int result = getMaxArea(0,N-1);
bw.flush();
bw.write(result+"\n");
}
bw.close();
}
public static int getMaxArea(int left, int right) {
if(left == right) {
return height[left];
}
int mid = (right + left)/2;
int ret = Math.max(getMaxArea(left,mid), getMaxArea(mid+1,right));
int lo = mid, hi = mid+1;
int midHeight = Math.min(height[lo], height[hi]);
ret = Math.max(ret, midHeight*2);
while(left < lo || hi < right) {
if(hi < right && (lo == left || height[lo-1] < height[hi+1])) {
hi++;
midHeight = Math.min(midHeight, height[hi]);
}else {
lo--;
midHeight = Math.min(midHeight, height[lo]);
}
ret = Math.max(ret, midHeight * (hi-lo+1));
}
return ret;
}
}
'[개발] 지식 > 알고리즘 문제풀이' 카테고리의 다른 글
[알고스팟] Quantization (0) | 2019.05.05 |
---|---|
[문제][알고스팟]WILDCARD (0) | 2019.02.06 |
[문제][알고스팟] 쿼드트리 뒤집기 (QUADTREE) (0) | 2018.12.10 |
[문제][알고스팟] BOARDCOVER (게임판 덮기) (0) | 2018.08.22 |
[문제][알고스팟] PICNIC (0) | 2018.08.13 |
<