1. 문제 링크
https://www.acmicpc.net/problem/10804
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 |