ABOUT ME

-

Today
-
Yesterday
-
Total
-
  • 백준 10804(카드 역배치) c++
    백준 문제 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;
    }

     

    '백준 문제' 카테고리의 다른 글

    백준 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
Designed by Tistory.