[BOJ-Code] 2230 - 수 고르기

Posted by DHniyeo Blog on December 3, 2024

[문제 링크](https://www.acmicpc.net/problem/2230)

💡 정렬/두 포인터

Memory: 2800KB Time: 68ms Code Length: 506B
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
#include<iostream>
#include<vector>
#include<algorithm>
using namespace std;

int N, M;
vector<int> dict;
void init() {
	cin >> N >> M;
	for (int i = 0; i < N; i++) {
		int num;
		cin >> num;
		dict.push_back(num);
	}
	sort(dict.begin(), dict.end());
}
int solve() {
	int en = 0;
	int mn = 2'000'000'001;
	for (int st = 0; st < N; st++) {
		while (en < N && dict[en] - dict[st] < M) en++;
		if (en == N) break;
		mn = min(mn, dict[en] - dict[st]);
	}
	return mn;
}
int main() {
	init();
	cout << solve();
}

init() 함수는 N과 M을 입력받고, N개의 숫자를 입력받아 dict 벡터에 저장한 뒤 오름차순으로 정렬한다.

solve() 함수는 시작점(st)을 기준으로 끝점(en)을 이동시키면서 dict[en] - dict[st]가 M보다 작은 경우에 en을 증가시킨다. 이 과정을 반복하면서 최소 간격을 구하고, 그 값을 반환한다.

main() 함수에서는 init() 함수를 호출하여 초기화를 수행하고, solve() 함수를 호출하여 문제를 해결한 뒤 결과를 출력한다.