코드
import java.io.BufferedReader;
import java.io.InputStreamReader;
import java.util.*;
class Main {
static int N,H,rangeCount=0, stalactiteCount = Integer.MAX_VALUE;
static int[] ceilingAccumulate, floorAccumulate;
public static void main(String[] args) throws Exception {
BufferedReader br = new BufferedReader(new InputStreamReader(System.in));
StringBuilder sb = new StringBuilder();
StringTokenizer st = new StringTokenizer(br.readLine());
N = Integer.parseInt(st.nextToken());
H = Integer.parseInt(st.nextToken());
ceilingAccumulate = new int[H+1];
floorAccumulate = new int[H+1];
for(int i=0; i<N; i++){
int stalactite = Integer.parseInt(br.readLine());
if(i%2==1) ceilingAccumulate[stalactite]+=1;
else floorAccumulate[stalactite] += 1;
}
for(int i=H-1; i>=0; i--){
ceilingAccumulate[i] += ceilingAccumulate[i+1];
floorAccumulate[i] += floorAccumulate[i+1];
}
for(int i=1; i<=H; i++){
int toAvoid = floorAccumulate[i] + ceilingAccumulate[H-i+1];
if(toAvoid < stalactiteCount){
stalactiteCount = toAvoid;
rangeCount = 1;
}else if(toAvoid == stalactiteCount){
rangeCount++;
}
}
System.out.println(stalactiteCount+ " " + rangeCount);
}
}
- 천장의 종유석과 바닥의 종유석 각각 누적합으로 저장한다.
- floorAccumulate[i]는 바닥에 붙어있는 i이상의 높이를 가진 종유석의 개수를 저장.
- 천장도 마찬가지로 저장
- 이후 floorAccumulate[i] + ceilingAccumulate[H-i+1]가 최소가 되는 경우를 찾고 그 개수를 세면 된다.