ABOUT ME

-

Today
-
Yesterday
-
Total
-
  • 백준 2230 수 고르기 | C++
    [백준 알고리즘]/[C++] 2021. 3. 24. 10:41
    728x90
    반응형

     

     

    이번 포스팅은 백준 2230번 수 고르기입니다.

    아래 url를 클릭하시면 백준 사이트에서 문제를 볼 수 있습니다.

    www.acmicpc.net/problem/2230

     

    2230번: 수 고르기

    첫째 줄에 두 정수 N, M(0≤M≤2,000,000,000)이 주어진다. 다음 N개의 줄에는 차례로 A[1], A[2], …, A[N]이 주어진다. 각각의 A[i]는 0 ≤ |A[i]| ≤ 1,000,000,000을 만족한다.

    www.acmicpc.net

     

     

     

    기본 알고리즘

    투 포인터

     

     

    셸 정렬 사용함

    벡터와 sort 함수를 사용하면 코드의 길이와 실행 시간을 단축할 수 있다.

     

     

     

     

     

    전체 코드

     

    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
    51
    52
    53
    54
    55
    56
    57
    58
    59
    60
    61
    62
    63
    //백준2230 수 고르기                                                        
    #include <iostream>
    using namespace std;
     
    void sortGapInsertion(int list[], int first, int last, int gap) {
        int i, j, key;
        for (i = first + gap; i <= last; i += gap) {
            key = list[i];
            for (j = i - gap; j >= first && list[j] < key; j -= gap) {
                list[j + gap] = list[j];
            }
            list[j + gap] = key;
        }
    }
     
    void shellSort(int list[], int n) {
        int gap;
        for (gap = n / 2; gap > 0; gap /= 2) {
            if (gap % 2 == 0) {
                gap++;
            }
            for (int i = 0; i < gap; i++) {
                sortGapInsertion(list, i, n - 1, gap);
            }
        }
    }
        
     
    int main() {
        int N, M;
        const int SIZE = 100000;
        int list[SIZE];
     
        cin >> N >> M;
        for (int i = 0; i < N; i++) {
            cin >> list[i];
        }
        
        /*셸 정렬 - 내림차순으로 구현*/
        shellSort(list, N);
     
        /*투 포인터*/
        int left = 0;
        int right = 0;
        int ans = 2000000000;
        while (right<N&&left<N) {
            int temp = list[left] - list[right];
            if (temp > M) {
                ans = min(ans, temp);
                left++;
            }
            else if (temp < M) {
                right++;
            }
            else if (temp == M) {
                ans = min(ans, temp);
                right++;
            }
        }
     
        cout << ans;
        return 0;
    }
    cs

     

     

     

     

    728x90
    반응형

    '[백준 알고리즘] > [C++]' 카테고리의 다른 글

    백준 1516 게임 개발 | C++  (0) 2021.03.26
    백준 2437 저울 | C++  (0) 2021.03.25
    백준 14567 선수과목 (Prerequisite) | C++  (0) 2021.03.23
    백준 2109 순회강연 | C++  (0) 2021.03.18
    백준 1744 수 묶기 | C++  (0) 2021.03.17

    댓글

S.B. All Rights Reserved.