문제풀이/TwoPointer

[PS] BOJ2230 수 고르기 ( TwoPointer ) with JAVA

IT록흐 2023. 9. 15. 08:43
반응형
 

2230번: 수 고르기

N개의 정수로 이루어진 수열 A[1], A[2], …, A[N]이 있다. 이 수열에서 두 수를 골랐을 때(같은 수일 수도 있다), 그 차이가 M 이상이면서 제일 작은 경우를 구하는 프로그램을 작성하시오. 예를 들어

www.acmicpc.net

 

 

◎ 문제풀이

 

아직 투포인터 알고리즘에 대학 숙련도가 낮아 처음에 투포인터를 어디에 위치시켜야 할지를 몰랐다. 

 

 

[BOJ] 백준 2230번 : 수 고르기 (JAVA)

문제 N(1≤N≤100,000)개의 수로 이루어진 수열 A[1], A[2], …, A[N]이 있다. 이 수열에서 두 수를 골랐을 때(같은 수일 수도 있다), 그 차이가 M 이상이면서 제일 작은 경우를 구하는 프로그램을 작성하

steady-coding.tistory.com

 

위 블로그에 잘 나와있다. 

 

수열의 두 수를 골라 차이가 M 이상인 경우를 고르는 문제이다. 

 

1) 오름차순 정렬한다.

2) 좌측에 두 개의 포인터를 위치하고 하나씩 움직인다. 

 

M 이하면 Pointer1, M이상이면 Pointer2를 이동한다. 

 

◎ 코드

package org.example.twopointer;


import java.io.BufferedReader;
import java.io.IOException;
import java.io.InputStreamReader;
import java.util.Arrays;
import java.util.StringTokenizer;

//BOJ2230 수 고르기
public class Tp3 {

    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 pointer1 = 0;
        int pointer2 = 0;
        int ans = 2000000000;

        while(true){
            int diff = arr[pointer2] - arr[pointer1];

            if(diff == m){
                ans = diff;
                break;
            }
            else if(diff>m){
                ans = Math.min(ans,diff);
                pointer1++;
            }
            else if(diff<m){
                if(pointer2 == n-1) break;
                pointer2++;
            }
            else{ //diff == 0
                if(pointer2 == n-1) break;
                pointer2++;
            }
        }

        System.out.println(ans);

    }
}

 

 

반응형