목차
문제 정보
https://www.acmicpc.net/problem/2230
난이도 : G5
유형 : 투포인터, 이분탐색
시간 : O(NlogN)
문제 풀이
투포인터와 이분탐색을 같이 사용하여 풀이를 했다.
투포인터는 왼쪽, 오른쪽 포인터를 이용하는 개념이다.
왼쪽 포인터는 순차적으로 수열의 인덱스로 사용하였고
오른쪽 포인터는 이분탐색으로 얻은 인덱스로 사용하였다.
주의할 점은 이분탐색을 하기 전에는 미리 정렬을 해주어야 한다.
코드
import java.io.BufferedReader;
import java.io.IOException;
import java.io.InputStreamReader;
import java.util.Arrays;
import java.util.StringTokenizer;
public class Main {
private int N, M;
private int[] numbers;
private int res;
public void solution() throws IOException {
BufferedReader br = new BufferedReader(new InputStreamReader(System.in));
StringTokenizer st = new StringTokenizer(br.readLine());
N = Integer.parseInt(st.nextToken());
M = Integer.parseInt(st.nextToken());
numbers = new int[N];
for (int i = 0; i < N; i++) {
numbers[i] = Integer.parseInt(br.readLine());
}
Arrays.sort(numbers);
int left = 0;
int right = N;
int mid;
res = numbers[right - 1] - numbers[left];
for (int i = 0; i < N; i++) {
left = i;
right = N;
out:
while (left < right) {
mid = left + right >> 1;
if (numbers[mid] - numbers[i] == M) {
res = numbers[mid] - numbers[i];
break out;
} else if (numbers[mid] - numbers[i] > M) {
right = mid;
} else {
left = mid + 1;
}
}
if (right == N) {
continue;
}
res = Math.min(res, numbers[right] - numbers[i]);
}
System.out.println(res);
}
public static void main(String[] args) throws IOException {
new Main().solution();
}
}
'Algorithm, Problem Solving > 백준(boj)' 카테고리의 다른 글
[백준][Java] 14728 - 벼락치기 (0) | 2023.04.01 |
---|---|
[백준][Java] 6186 - Best Grass (0) | 2023.03.31 |
[백준][Java] 12904 - A와 B (0) | 2023.03.29 |
[백준][Java] 2212 - 센서 (0) | 2023.03.28 |
[백준][Java] 15486 - 퇴사 2 (0) | 2023.03.28 |
댓글