https://www.acmicpc.net/problem/1059
1059번: 좋은 구간
유형
수학, 배열
해설
좋은 구간이란 4 8 13 24 30이 주어지고 n이 10일 때 8과 13 사이에 10이 있으므로 10을 포함하는 모든 구간을 말한다. 이때 8과 13은 제외하므로 [9,10], [9,11], [9,12], [10,11], [10,12]가 된다. 이 경우 10보다 작은 9를 포함하고 있을 때 10을 포함하여 10보다 큰 경우를 모두 포함하고 있고, 10을 첫 번째 인수로 받은 경우 10보다 크고 13보다 작은 경우의 2가지만 포함하고 있는 것을 확인할 수 있다.
위의 경우를 통해 8과 13을 제외한 9 10 11 12가 있고 n이 10이면 (10보다 작은 수의 개수) * (10을 포함한 10보다 큰 수의 개수) + (10보다 큰 수의 개수) 가 되는 것을 볼 수 있다. 이걸 공식으로 만들면 문제를 해결할 수 있다.
풀이
package baekjoon_java.SilverIV;
import java.util.*;
import java.io.*;
public class 좋은구간 {
public static void main(String[] args) throws IOException {
BufferedReader in = new BufferedReader(new InputStreamReader(System.in));
StringTokenizer st = new StringTokenizer(in.readLine());
int N =stoi(st.nextToken());
int arr[] = new int[N];
st = new StringTokenizer(in.readLine());
for (int i = 0; i < arr.length; i++) {
arr[i]= stoi(st.nextToken());
}
st = new StringTokenizer(in.readLine());
int M = stoi(st.nextToken());
Arrays.sort(arr);
int left=0, right=987654321;
boolean find=false;
for (int i = 0; i < arr.length; i++) {
if (arr[i]>M) {
right=Math.min(right, arr[i]);
}else if(arr[i]<M){
left=Math.max(left, arr[i]);
}else {
find=true;
break;
}
}
int L = (M-left-1);
int R = (right-M-1);
int answer = L + R +(L*R);
if(find)
System.out.println(0);
else
System.out.println(answer);
}
static int stoi(String s) {
return Integer.valueOf(s);
}
}