1. 문제 링크

https://www.acmicpc.net/problem/10804

 

10804번: 카드 역배치

1부터 20까지 오름차순으로 놓인 카드들에 대해, 입력으로 주어진 10개의 구간 순서대로 뒤집는 작업을 했을 때 마지막 카드들의 배치를 한 줄에 출력한다. 

www.acmicpc.net

 

 

 

2. 문제 설명

10개의 구간을 입력받아 구간만큼 배열을 뒤집어서 출력하는 문제입니다.

 

 

 

3. 소스코드

BOJ 10804번 카드 역배치 C++ 풀이입니다.

#include <iostream>
#include <vector>
#include <algorithm>
using namespace std;

int main(void)
{
	ios::sync_with_stdio(0);
	cin.tie(0); cout.tie(0);

	int begin, end;
	vector<int> v(21);
	for(int i = 0; i < 21; i++) v[i] = i;

	for(int i = 0; i < 10; i++) {
		cin >> begin >> end;
		reverse(v.begin() + begin, v.begin() + end + 1);
	}
	for(int i = 1; i < 21; i++)
		cout << v[i] << ' ';

	return 0;
}

카드의 번호가 1부터 시작하므로 vector크기를 21로 선언하고, 1~20번 인덱스를 사용했습니다.

reverse함수를 사용하여 입력받은 구간만큼 배열을 뒤집었습니다.

reverse함수의 사용법은 revers(시작 지점, 끝 지점) 입니다.

시작 지점을 포함하고, 끝 지점을 포함하지 않는 범위까지 요소들을 뒤집어줍니다.

예를 들어 5 10이 입력되면 5~10번 인덱스를 뒤집어야 합니다.

v.begin()은 0번 인덱스를 의미하므로 v.begin() + begin은 5번 인덱스를 의미합니다.

v.begin() + end + 1은 11번 인덱스를 의미하므로 10번 인덱스까지 뒤집어집니다.

 

 

 

#include <iostream>
#include <vector>
#include <algorithm>
using namespace std;

int main(void)
{
	ios::sync_with_stdio(0);
	cin.tie(0); cout.tie(0);

	int begin, end;
	vector<int> v(21);
	for(int i = 0; i < 21; i++) v[i] = i;

	for(int i = 0; i < 10; i++) {
		cin >> begin >> end;
		for (int j = 0; j < (end - begin) / 2 + 1; j++)
			swap(v[begin + j], v[end - j]);
	}
	for(int i = 1; i < 21; i++)
		cout << v[i] << ' ';

	return 0;
}

reverse함수 대신 swap함수를 사용해서 해당 범위를 뒤집는 방식으로 풀어도 됩니다.

'Algorithm > Study' 카테고리의 다른 글

[백준 2439번 C++] 별 찍기 - 2  (0) 2020.04.30
[백준 2438번 C++] 별 찍기 - 1  (0) 2020.04.30
[백준 1267번 C++] 핸드폰 요금  (0) 2020.04.30
[백준 2577번 C++] 숫자의 개수  (0) 2020.04.30
[백준 10093번 C++] 숫자  (0) 2020.04.29

+ Recent posts