※ 글쓴이는 취미로 코딩을 익혀보는 사람이라 정확하지 않은 내용을 담고 있을 수 있다 ※

 

이번에 볼 문제는 백준 2230번 문제인 수 고르기이다.
문제는 아래 링크를 확인하자.

https://www.acmicpc.net/problem/2230 

 

2230번: 수 고르기

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

www.acmicpc.net

주어지는 N개의 수를 오름차순으로 정렬해두자.

 

차를 계산할 두 수중 작은 수의 인덱스를 L, 큰 수의 인덱스를 R이라 하자. 이 때 모든 두 수의 쌍에는 L과 R이 존재하므로 모든 각각의 R에 대한 문제의 답(M 이상의 차의 값 중 최솟값)을 구해 그중 가장 작은 값을 구하는 것으로 문제를 해결할 수 있음을 알 수 있다.

 

한편, N개의 수 중 R번째 수를 큰 수로 하면서 차를 최소화(단, M 이상)하는 인덱스 L은 R이 커지면 따라서 커지는 관계에 있음을 관찰하자. 따라서 이 문제는 투포인터 구현을 통한 O(N)의 스위핑(sweeping)을 이용해 문제를 해결할 수 있다.

 

아래는 제출한 소스코드이다.

#include <iostream>
#include <algorithm>
using namespace std;

int N, M;
int arr[100000];
int ans = 2000000007;

int main() {
	ios::sync_with_stdio(0);
	cin.tie(0);

	cin >> N >> M;
	for (int i = 0; i < N; i++) cin >> arr[i];
	sort(arr, arr + N);
	for (int i = 1; i < N; i++) arr[i] -= arr[0];
	arr[0] = 0;

	int L = 0, R = 0;
	while (R < N) {
		if (arr[R] - arr[L] < M) R++;
		else {
			ans = min(ans, arr[R] - arr[L]);
			L++;
		}
	}

	cout << ans;
}
728x90

'BOJ' 카테고리의 다른 글

[BOJ 2201 // C++] 이친수 찾기  (0) 2023.07.08
[BOJ 2248 // C++] 이진수 찾기  (0) 2023.07.08
[BOJ 2242 // C++] 삼각형 만들기  (0) 2023.07.06
[BOJ 2107 // C++] 포함하는 구간  (0) 2023.07.05
[BOJ 5446 // C++] 용량 부족  (0) 2023.07.04

+ Recent posts