문제
#10812: 장바구니 주문 변경
도현이의 바구니는 총 N개이며 각 바구니는 1부터 N까지 순차적으로 번호가 매겨져 있습니다. 바구니가 정렬되어 가장 왼쪽 바구니가 첫 번째 바구니이고 다음 바구니가 두 번째 바구니입니다.
www.acmicpc.net
암호
#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);