-
백준 10804(카드 역배치) c++백준 문제 2021. 9. 5. 16:20728x90
숫자카드 가 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; }
'백준 문제' 카테고리의 다른 글
백준 1008(A/B) c++ (0) 2021.09.05 백준 1158(요세푸스 문제) c++ (0) 2021.09.05 백준 15552(빠른 A+B) C / C++ (0) 2021.09.05 백준 16563번 (어려운 소인수분해) c++ (0) 2021.08.31 백준 11653번 (소인수분해) c언어 (0) 2021.08.30