백준 문제

백준 10804(카드 역배치) c++

kangyuseok 2021. 9. 5. 16:20
728x90

 

문제

 

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;
}