알고리즘/투 포인터
[BOJ 2230] 수 고르기 (Java, 투포인터)
leejinwoo1126
2023. 6. 6. 15:43
반응형
문제 링크
https://www.acmicpc.net/problem/2230
2230번: 수 고르기
N개의 정수로 이루어진 수열 A[1], A[2], …, A[N]이 있다. 이 수열에서 두 수를 골랐을 때(같은 수일 수도 있다), 그 차이가 M 이상이면서 제일 작은 경우를 구하는 프로그램을 작성하시오. 예를 들어
www.acmicpc.net
풀이
- 시간복잡도 O(NlogN) = 정렬 O(NlogN) 후 투 포인터 O(N) 수행
- Integer 범위 내이긴 하지만, 초기화시 일부 long 선언 처리
- M 만큼의 차이가 날 때까지 R을 먼저 탐색, A[R] - A[L] > M 조건 성립시 결과값 갱신 (최소값)
제출 코드
import java.util.*;
import java.io.*;
public class Main {
static int N;
static long M;
static long[] A;
static void input() throws Exception {
BufferedReader br = new BufferedReader(new InputStreamReader(System.in));
StringTokenizer st = new StringTokenizer(br.readLine());
N = Integer.parseInt(st.nextToken());
M = Long.parseLong(st.nextToken());
A = new long[N + 1];
for(int i = 1; i <= N; i++) {
st = new StringTokenizer(br.readLine());
A[i] = Integer.parseInt(st.nextToken());
}
}
static void pro() {
Arrays.sort(A, 1, N + 1); // 오름차순 정렬 필수
int ans = Integer.MAX_VALUE;
for(int L = 1, R = 1; L <= N; L++) {
while(R + 1 <= N && A[R] - A[L] < M) { // 주의*
R += 1;
}
if(A[R] - A[L] >= M) {
ans = Math.min(ans, (int)(A[R] - A[L]));
}
}
System.out.println(ans);
}
public static void main(String[] args) throws Exception {
input();
pro();
}
}
반응형