백준 10804(카드 역배치) c++
10804번: 카드 역배치
1부터 20까지 오름차순으로 놓인 카드들에 대해, 입력으로 주어진 10개의 구간 순서대로 뒤집는 작업을 했을 때 마지막 카드들의 배치를 한 줄에 출력한다.
www.acmicpc.net
숫자카드 가 1부터 20까지 오름차순으로 놓여져 있다고 가정합니다. 이때 구간을 입력 받으면
그 구간의 수들을 역배치 하고 출력하는 문제 입니다.
예를 들어 구간이 [1,5] 이렇게 주어진다면 1번 카드부터 5번 카드를 역배치 시키는 문제 입니다.
c++의 stl 함수인 reverse 함수를 사용해 주었습니다. reverse 함수는 구간을 설정할 수 있는데
만약 벡터 v가 있다고 할때 reverse(v.begin(),v.end())이렇게 주어지면
v.begin()이 가리키는 원소를 포함해서 v.end()가 가리키는 원소 바로 전까지를 역배치합니다.
따라서 reverse함수의 첫번째 인자는 포함하고 두번째 인자는 바로직전까지 포함시킵니다.
vector<int>v = { 1,2,3,4,5,6,7,8,9,10,11,12,13,14,15,16,17,18,19,20 };
먼저 1부터 20까지 카드가 오름차순으로 있으므로 벡터에 먼저 1~20 숫자를 집어 넣어 줍니다.
for (int i = 0; i < 10; i++) {
int a, b;
cin >> a >> b;
reverse(v.begin()+a-1, v.begin()+b);
}
10번 입력받을 수 있으므로 for문으로 10번 반복을 설정합니다.
그 다음 구간 [a,b]를 입력받아야 하므로 정수 a,b를 선언하고 입력 받습니다.
여기서 핵심은 reverse함수인데 첫번째 인자로 v.begin()+a-1을 받습니다.
reverse함수의 첫번째 인자는 반드시 포함시킵니다.
또한 v.begin() 은 자체적으로 이미 첫번째 원소를 가리키고 있습니다.
따라서 v.begin()+1을 하면 첫번째 원소를 가리키는게 아니라 두번째 원소를 가리키게 됩니다.
그러므로 자체적으로 -1을 하여 위치를 맞춰주는 것입니다.
마찬가지로 두번째 인자는 -1을 해주지 않았습니다.
두번째 인자가 가리키는 곳은 포함을 안하고 두번째 인자가 가리키는 원소 직전 까지 포함시키기 때문입니다.
따라서 그 자체로 -1을 해주기 때문에 -1을 할 필요가 없습니다.
for (int i = 0; i < 20; i++) {
cout << v[i] << ' ';
}
마지막으로 역배치 10번을 하고 벡터를 출력해줍니다.
전체 코드 입니다.
#include<iostream>
#include<algorithm>
#include<vector>
using namespace std;
int main() {
ios_base::sync_with_stdio(false), cin.tie(NULL), cout.tie(NULL);
vector<int>v = { 1,2,3,4,5,6,7,8,9,10,11,12,13,14,15,16,17,18,19,20 };
for (int i = 0; i < 10; i++) {
int a, b;
cin >> a >> b;
reverse(v.begin()+a-1, v.begin()+b);
}
for (int i = 0; i < 20; i++) {
cout << v[i] << ' ';
}
return 0;
}