본문 바로가기

백준

2230번: 수 고르기(Java)

 투 포인터를 사용해 해결할 수 있다. 우선, 필요한 변수들을 선언한다. 

int N, M;
Scanner scanner = new Scanner(System.in);
N = scanner.nextInt();
M = scanner.nextInt();
int[] arr = new int[N];
int p1 = 0;
int p2 = 0;
int result = 2000000000;

|A[i]|의 범위가 0~1000000000 이므로, 두 수의 차이는 최대 2000000000까지 될 수 있다. 따라서 result를 우선 2000000000로 설정했다.

 

 

 

arr에 데이터를 넣어 주고, 투 포인터를 사용해야 하기 때문에 arr를 정렬해준다. 

Arrays.setAll(arr, i -> scanner.nextInt());
Arrays.sort(arr);

 

 

 이제 문제에 대해 생각해야 한다. 투 포인터를 사용해 O(n)으로 끝내야 한다. 우선 while문은 p1 < N && p2 < N일때 반복한다. 

 정렬된 배열이므로, p2 - p1이 M보다 크거나 같은 순간, p1++을 해 주고, result를 갱신하면 된다. 그게 아니라면 p2++을 통해 2번째 포인터를 증가시켜주면 된다. 마지막으로 result를 출력해주면 된다.

while(p1 < N && p2 < N){
    int sub = arr[p2] - arr[p1];
    if(sub >= M){
        result = Math.min(result, sub);
        if(result == M){
            break;
        }
        p1++;
    }
    else{
        p2++;
    }
}
System.out.println(result);

 

 

 

 

 

 

 

결과 코드

import java.util.*;

public class Main {
    public static void main(String[] args) {
        int N, M;
        Scanner scanner = new Scanner(System.in);
        N = scanner.nextInt();
        M = scanner.nextInt();
        int[] arr = new int[N];
        int p1 = 0;
        int p2 = 0;
        int result = 2000000000;
        Arrays.setAll(arr, i -> scanner.nextInt());
        Arrays.sort(arr);
        while(p1 < N && p2 < N){
            int sub = arr[p2] - arr[p1];
            if(sub >= M){
                result = Math.min(result, sub);
                if(result == M){
                    break;
                }
                p1++;
            }
            else{
                p2++;
            }
        }
        System.out.println(result);
    }
}

'백준' 카테고리의 다른 글

2559번: 수열(Java)  (0) 2023.07.25
11659번: 구간 합 구하기 4(Java)  (2) 2023.07.23
16139번: 인간-컴퓨터 상호작용(Java)  (0) 2023.07.22
11279번: 최대 힙(Java)  (0) 2023.04.17
1043번: 거짓말(Java)  (0) 2023.04.13