https://www.acmicpc.net/problem/1059
백준 1059번 좋은 구간 문제이다
실버 4정도 되는 문제인데, 정답률이 너무 낮아서 풀어보았다
우선 집합 S를 크기별로 정렬한다.
그럼 셋째줄에서 입력 받는 n이 집합 S에서 속하는 구역이 무조건 생긴다. 그 구역을 찾아 그 안에서 문제에 맞는 구간을 찾으면 된다.
이때, 경우의 수 3가지를 각각 고려하면 쉽게 풀 수 있는 문제이다.
1. 구역 내에서 n이 최대가 되는 구간
2. 구역 내에서 n이 최소가 되는 구간
3. 구역 내에서 n이 중간에 있는 구간
1번은 n보다 작은 구역의 수들을 세고,
2번은 n보다 큰 구역의 수들을 세고,
3번은 1번*2번 을 하여
이 세가지 숫자들을 더 해주면 된다
import java.io.BufferedReader;
import java.io.IOException;
import java.io.InputStreamReader;
import java.util.Arrays;
import java.util.StringTokenizer;
import static java.util.stream.Collectors.counting;
public class Main {
public static void main(String[] args) throws IOException {
BufferedReader br = new BufferedReader(new InputStreamReader(System.in));
int L = Integer.parseInt(br.readLine());
String arr = br.readLine();
int n = Integer.parseInt(br.readLine());
StringTokenizer st = new StringTokenizer(arr);
int [] array = new int[L+1];
array[0] = 0;
for(int i=1; i< array.length; i++){
array[i] = Integer.parseInt(st.nextToken());
}
Arrays.sort(array);
int start = 0;
int end= 0;
for(int i=1; i< array.length; i++){
if(array[i] == n){
System.out.print(0);
return;
} else if (n < array[i]) {
start = array[i-1]+1;
end = array[i]-1;
break;
}
}
System.out.print(counting(start, end, n));
}
private static int counting(int start, int end, int n) {
int count = 0;
count += n-start; // n이 최대일때 경우의 수
count += end-n; // n이 최소일때 경우의 수
count += (n-start)*(end-n); //n이 중간에 있을때 경우의 수
return count;
}
}
정답률이 낮길래 쫄았는데, 생각할 것도 별로 없고 금방 풀어서 시시했다