728x90
문제
접근 방식
두 수의 차이가 m 이상이면서 가장 작은 경우를 구해야 하는데
간단하게 이중 반복문으로도 풀 수는 있지만 입력의 크기를 생각하면
시간초과 때문에 다른 방법을 사용해야 한다.
골드 문제지만 투 포인터를 사용해서 풀면 간단하게 풀 수 있는 문제로
6개의 수가 주어졌을 때 차이가 3 이상인 수 중에서 가장 작은 경우를 찾아보겠다.
1 3 5 7 8 10
우선 위와 같이 주어진 수들이 정렬되어 있을 때
순서대로 비교할 기준을 처음인 1과 나머지 숫자들을 차이가 3 이상이 될 때까지 비교해보면
1 - 3 >> 2
1 - 5 >> 4
1 - 7 >> 6
1 - 8 >> 7
1 - 10 >> 9
5와 비교 했을 때 차이가 4로 처음으로 3보다 커지는데
이후의 비교는 차이가 점점 커지기 때문에 의미가 없다는 것을 알 수 있다.
그래서 차이가 처음으로 3보다 커진 경우에는 비교하는 기준 인덱스를
1에서 3으로 바꿔 준 후에 다시 비교를 해주면 된다.
3 - 5 >> 2
3 - 7 >> 4
3을 기준으로 비교하다 보면 마찬가지로 7과의 차이가 4일 때
기준이 다시 바뀌게 되고
5 - 7 >> 2
5 - 8 >> 3
5를 기준으로 다시 비교해보면 8과의 차이가 3으로
이후의 수들을 굳이 비교안해도 정답이 확실하기 때문에
탐색을 종료할 수 있다.
골드 문제지만 이렇게 투 포인터의 개념만 안다면 쉽게 풀 수 있다.
풀이
public class Main {
public static void main(String[] args) throws IOException {
BufferedReader br = new BufferedReader(new InputStreamReader(System.in));
StringTokenizer st = new StringTokenizer(br.readLine());
int n = Integer.parseInt(st.nextToken());
int m = Integer.parseInt(st.nextToken());
int[] arr = new int[n];
for (int i = 0; i < n; i++) {
arr[i] = Integer.parseInt(br.readLine());
}
Arrays.sort(arr);
int s = 0;
int e = 1;
int min = Integer.MAX_VALUE;
while (e < n) {
int minus = arr[e] - arr[s];
if (minus == m) {
min = m;
break;
}
if (minus >= min) {
s++;
continue;
}
if (minus > m) {
min = minus;
s++;
}
else e++;
}
System.out.println(min);
}
}
'Java > Algorithms' 카테고리의 다른 글
[백준] 1644번 : 소수의 연속합 (1) | 2023.12.15 |
---|---|
[백준] 1806번 : 부분합 (0) | 2023.12.15 |
[백준] 20166번 : 문자열 지옥에 빠진 호석 (0) | 2023.12.15 |
[백준] 1463번 : 1로 만들기 (0) | 2023.12.11 |
[백준] 15683번 : 감시 (0) | 2023.11.18 |