반응형
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);
}
}
반응형
'문제풀이 > TwoPointer' 카테고리의 다른 글
[PS] BOJ2118 두 개의 탑 ( TwoPointer ) with JAVA (0) | 2023.08.31 |
---|---|
[PS] BOJ2470 두 용액 ( Two Pointer ) with JAVA (0) | 2023.07.13 |