알고리즘/문제풀이
[BOJ] 수 고르기 (Java)
세동세
2024. 10. 8. 15:54
문제 링크
https://www.acmicpc.net/problem/2230
문제 이해
이 문제를 읽고 이분 탐색이 가장 먼저 생각났다. 이분 탐색으로 풀어도 어렵진 않았을 것 같은데, 나는 투포인터의 개념으로 풀었다.
다만, 투포인터를 쓸 때 start = 0 / end = size - 1 로 풀었었는데, 이번 경우는 start += 1 / end -= 1을 갱신하는 포인트가 애매하다고 생각했다.
이번 풀이는 start = 0 / end = 0 초기화된 상태에서 시작했다.
따라서 distance가 M보다 클 경우는 start를 높이면서 distance의 최숫값을 갱신하려고 했다.
그리고 distance가 M보다 작을 경우는 end를 키우면서 distance의 간격을 높여서 찾고자 했다.
기준값만 잘 두면 어렵지 않았던 문제였다.
예제
5 3
1
6
3
7
2
결과 : 3
코드
package BOJ;
import java.io.BufferedReader;
import java.io.IOException;
import java.io.InputStreamReader;
import java.util.Arrays;
import java.util.StringTokenizer;
/**
* BOJ_2230_수고르기
*
* N개의 정수로 이루어졌다.
* 수열에서 두 수를 골랐을 때 그 차이가 M이상이면서 제일 작은 경우
* {1, 2, 3, 4, 5}
*
* 1, 3, 5
* 5 - 1 = 4
* 3 - 1 = 2
*
* */
public class BOJ_2230_수고르기 {
static BufferedReader br;
static StringTokenizer st;
static int N;
static int M;
static int [] list;
static int min;
private static void simulation() {
int start = 0;
int end = 0;
min = Integer.MAX_VALUE; // 가장 작은 값
while (start < N && end < N) {
int distance = list[end] - list[start];
if (distance >= M) {
min = Math.min(distance, min);
start += 1;
} else {
end += 1;
}
}
}
public static void main(String[] args) throws IOException {
br = new BufferedReader(new InputStreamReader(System.in));
st = new StringTokenizer(br.readLine().trim());
N = Integer.parseInt(st.nextToken());
M = Integer.parseInt(st.nextToken());
list = new int [N];
for (int idx = 0; idx < N; idx ++) {
list[idx] = Integer.parseInt(br.readLine().trim());
}
Arrays.sort(list);
simulation();
System.out.println(min);
}
}