백준 2230 - 수 고르기

박진형·2021년 8월 20일
0

algorithm

목록 보기
69/111

문제 풀이

투 포인터 활용 문제이다.
데이터를 입력받고 오름차순으로 정렬을 한다.
최소값을 구하기위해서 최소값을 초기화 해주는데 약 10억 이상의 숫자를 해야될 것같다.
(처음에 습관처럼 987654321 -> 9억정도의 값으로 했다가 틀림, 문제를 잘 읽어보자)

먼저 l=0, r=0 부터 시작해서 포인터를 조건에 따라 움직여 줄건데, r을 먼저 움직일 것이다.
r은 A[r] - A[l]이 m보다 작을동안 계속 증가시켜준다 즉, 처음 A[r] - A[l]이 m 이상이게 될 때 멈춘다.
그 외의 경우에는 l을 증가 시켜준다. A[r] - A[l]이 m 이상이면서 차이가 가장 적은 값을 찾아주기 위해서다. 다시 A[r] - A[l]이 m보다 작아질 때에는 r을 다시 증가시켜주면 된다.

문제 링크

boj/2230

소스코드

PS/2230.java

  
    import java.io.*;
    import java.util.*;

    public class Main {
        static BufferedReader br = new BufferedReader(new InputStreamReader(System.in));
        static BufferedWriter bw = new BufferedWriter(new OutputStreamWriter(System.out));


        public static void main(String[] args) throws IOException {
            StringTokenizer st = new StringTokenizer(br.readLine());
            int n = Integer.parseInt(st.nextToken());
            int m = Integer.parseInt(st.nextToken());

            ArrayList<Integer> list = new ArrayList<>();
            for(int i=0;i<n;i++)
                list.add(Integer.parseInt(br.readLine()));
            Collections.sort(list);
            int l =0, r= 0;
            int min = 2100000000;
            while(l<=r)
            {
                if(r+1 <n && list.get(r) - list.get(l) <m)
                    r++;
              else
                    l++;
                if(l < n && list.get(r)-list.get(l)>=m)
                    min = Math.min(list.get(r) - list.get(l),min);
            }
            bw.write(Integer.toString(min));
            bw.flush();
        }
    }

0개의 댓글