반응형
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);
}
}
반응형
'문제풀이' 카테고리의 다른 글
[PS] BOJ9081 단어 맞추기 ( string ) with JAVA (0) | 2023.09.20 |
---|---|
[PS] BOJ3584 가장 가까운 공통 조상 ( tree ) with JAVA (0) | 2023.09.18 |
[PS] BOJ11404 플로이드 ( Floyd-Warshall ) with JAVA (0) | 2023.09.14 |
[PS] BOJ12738 가장 긴 증가하는 부분 수열3 ( LIS ) with JAVA (0) | 2023.09.13 |
[PS] BOJ1520 내리막 길 ( DP + DFS ) with JAVA (0) | 2023.09.11 |