[백준] 10812번 C++ 풀이

문제


암호

#include <iostream>
#include <vector>

int main()
{
    std::ios_base::sync_with_stdio(false);
    std::cin.tie(NULL); std::cout.tie(NULL);

    int n, m;
    std::cin >> n >> m;

    std::vector<int> arr;
    for (int i = 0; i < n; ++i) arr.emplace_back(i);

    while (m > 0)
    {
        int i, j, k;
        std::cin >> i >> j >> k;
        i--, j--, k--;

        auto copy = arr;
        copy.erase(copy.begin() + k, copy.begin() + j+1);
        copy.insert(copy.begin() + i, arr.begin() + k, arr.begin() + j + 1);
        arr = copy;

        m--;
    }

    for (auto& v : arr)std::cout << v + 1 << " ";
    std::cout << "\n";

    return 0;
}

설명

이것은 첫 번째 값의 위치에 입력 범위의 중간에서 끝까지 값을 삽입하여 배열의 일부 위치를 이동할 때 발생하는 문제입니다.

편리하게도 std::vector는 삭제 및 삽입을 지원하므로 범위를 쉽게 이동할 수 있습니다.

단, delete와 insert는 인자로 받은 삭제(또는 추가)할 벡터 범위의 시작점은 포함하고 끝점은 포함하지 않는다는 점에 유의해야 한다.

즉, 예를 들어 std::vector 배열의 인덱스 2에서 인덱스 4까지의 값을 원하는 경우 삭제하고 싶은 경우 아래와 같이 코드를 작성해도 원하는 결과가 나오지 않습니다.

std::vector<int> array = { 0,1,2,3,4,5,6,7,8,9 };
array.erase(array.begin() + 2, array.begin() + 4); // 이때 array = {0,1,4,5,6,7,8,9}

함수가 반복을 인수로 사용하기 때문에 이는 자연스러운 문제입니다. 이는 반복의 시작점과 끝점 사이의 데이터가 제거됨을 의미하며, array.begin() + 4의 값은 array(4)의 시작 위치를 가리킵니다. 위와 같이 코드를 작성하면 array(2)에서 array(3)까지의 데이터만 삭제된다.

따라서 배열의 2~4번째 인덱스 값을 지우려면 다음 함수를 사용해야 합니다.

array.erase(array.begin() + 2, array.begin() + 5);