알고리즘&자료구조/문제

[BOJ/2230번] 수 고르기 (C++/투포인터)

Nakuri 2023. 9. 16. 20:49
728x90

개요

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

 

2230번: 수 고르기

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

www.acmicpc.net

오랜만에 풀어봤다.

간단한 투포인터 문제다.

Gold V

풀이

입력 값을 vecter나 array에 정렬 후 front 부터 두 value 비교하면 된다.

차이가 M보다 작을 경우 front++ , 아닐 경우 back++ 를 해주면 된다.

 

코드

#include <bits/stdc++.h>
using namespace std;
constexpr int LIMIT = 1e5 + 2;
const int INF = 1e8 * 21;

int a[LIMIT];
int main()
{
	cin.tie(0)->sync_with_stdio(0);

	int n, m;
	cin >> n >> m;

	for (int i = 0; i < n; i++)
		cin >> a[i];

	sort(a, a + n, less<int>());

	int front = 0;
	int back = 0;
	int result = INF;
	while (front < n)
	{
		int diff = a[back] - a[front];
		
		if(diff >= m)
			result = min(result, diff);

		if (diff > m || back >= n-1) front++;
		else back++;
	}
	cout << result;
}

 

이제 다시 달려야지