https://www.acmicpc.net/problem/2230
2230번: 수 고르기
N개의 정수로 이루어진 수열 A[1], A[2], …, A[N]이 있다. 이 수열에서 두 수를 골랐을 때(같은 수일 수도 있다), 그 차이가 M 이상이면서 제일 작은 경우를 구하는 프로그램을 작성하시오. 예를 들어
www.acmicpc.net
틀린 이유
투포인터의 범위 증감 방향을 잘못 설정.
정렬했기 때문에 인접한 원소가 가장 작은 차이를 가진다. 따라서 인접한 원소부터
범위를 늘려가면서 최적해를 찾아야 답을 찾을 수 있다.
문제 접근
N이 10만이기 때문에 완전탐색은 사용불가능.
차이가 최소인 경우를 찾기 위해 정렬이 필요하다. 차이를 비교하면서 탐색해야 하는데, 이 때 투포인터를 사용하여 인접한 원소가 가장 작은 차이를 갖는건 자명하기 때문에 0, 1 인덱스부터 시작하여 조건을 만족하면 왼쪽의 범위를 줄이고, 만족하지 않으면 오른쪽의 범위를 늘리면서 찾는다.
정답 코드
더보기
import java.io.*;
import java.util.*;
public class Main {
public static void main(String[] args) throws Exception{
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++){
st = new StringTokenizer(br.readLine());
arr[i] = Integer.parseInt(st.nextToken());
}
//정렬하고 투포인터로 범위 좁히면서 탐색
Arrays.sort(arr);
long answer = arr[arr.length - 1] - arr[0];
int l = 0, r = 1;
while(l <= r && r < arr.length){
long diff = Math.abs(arr[r] - arr[l]);
if(diff < M){
r++;
}
else{
l++;
answer = Math.min(answer, diff);
}
}
System.out.println(answer);
}
}
'알고리즘 관련 > BOJ' 카테고리의 다른 글
16197 두 동전 (0) | 2021.12.22 |
---|---|
2251 물통 (0) | 2021.11.21 |
15565 귀여운 라이언 (0) | 2021.11.07 |
1138 한 줄로 서기 (0) | 2021.11.06 |
2887 행성 터널 (0) | 2021.10.28 |