Game Develop

[Algorithm] Baekjoon 2230번 : 수 고르기 본문

Algorithm/Baekjoon

[Algorithm] Baekjoon 2230번 : 수 고르기

MaxLevel 2023. 4. 30. 07:13

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

 

2230번: 수 고르기

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

www.acmicpc.net

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
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
int minNum = 2000000002;
int arr[100001= { 0 };
 
int main()
{
    ios::sync_with_stdio(false);
    cin.tie(0);
    cout.tie(0);
 
    int n, m;
    vector<int> v;
    
    cin >> n >> m;
 
    for (int i = 0; i < n; ++i)
    {
        int temp = 0;
        cin >> temp;
        v.push_back(temp);
    }
 
    sort(v.begin(), v.end());
 
    int left = 0;
    int right = 0;
 
    while (right < n)
    {
        int gap = v[right] - v[left];
 
        if (gap == m)
        {
            cout << gap;
            return 0;
        }
 
        if (gap >= m)
        {
            minNum = min(minNum, v[right] - v[left]);
 
            ++left;
        }
        else
        {
            ++right;
        }
    }
 
    cout << minNum;
}
cs

 

여러유형을 풀어보는것도 중요해서 오랜만에 투포인터 문제를 풀어봤다.

그닥 어려운 문제는 아닌데, m이상의 차이가 나는 두 수를 선택했을 때, 최소값을 출력하는 문제다.

수의 차이를 이용해야하는 문제라서 일단 입력받은 값들을 한번 정렬해준다.

그래야 투포인터개념이 적용될 수 있다. 즉, left와 right를 이동하는데 의미가 생긴다.

 

같은값을 두번 사용할 수 있다고 하니 left, right 둘 다 0부터 시작한다.

그리고 두 값의 차이가 m이상일 경우 minNum을 업데이트 한다음 다시 간격을 좁혀야하니 left값을 1 증가시키고, 두 값의 차이가 m 미만이라면 m이상이 되게 해야하기 때문에 right를 1 증가시킨다.

 

해당 과정을 반복하다 right가 범위를 벗어나면 종료시킨다.