Algorithm

[백준/C++] 10812 바구니 순서 바꾸기 (B2)

Yannoo 2023. 10. 16. 07:56
728x90
유형 난이도 완료일 링크 특이사항
배열 브론즈2 23/03/13 https://www.acmicpc.net/problem/10812  

 

 

내 코드

#include <iostream>

using namespace std;

int arr[101];

int main(int argc, char* argv[])
{
	int n, m;
	cin >> n >> m;
	
	for(int i=1; i<=n; i++)
		arr[i]=i;
	
	int a,b,c;
	for(int i=0;i<m;i++)
	{
		cin >> a >> b >> c;
		
		int temp1[100]={};
		for(int j =0; j< b-c+1; j++)
		{
			temp1[j] = arr[j+c];
		}
		int temp2[100]={};
		for(int j =0; j<c-a; j++)
		{
			temp2[j] = arr[j+a];
		}
		
		int k = 0;
		for(int j = c-a-1; j>=0; j--)
		{
			arr[b-k] = temp2[j];
			k++;
		}
		
		for(int j=0; j<b-c+1; j++)
		{
			arr[a+j] = temp1[j];
		}
	}
	
	for(int i=1;i<=n;i++)
		cout<<arr[i]<<" ";
	
}

브론즈 2 문제여서 후딱 풀려고 시도했는데 꽤 시간을 썼다. 배열로만 해결하려고 마음먹어서 반복문을 많이 쓰다보니 인덱스, 반복문 범위를 설정하는게 복잡했다. 핵심은 i j k 를 입력받고 [i~k-1, k~j] 순서로 이루어진 배열을 [k~j~i~(k-1)] 형태로 바꾸는 것이다. 반복문과 임시 배열을 설정하여 바꿀 값들을 잠시 빼둔 후 재할당 하는 방식으로 풀었다. 꼬인 풀이 같은 느낌이었다. 어려운 논리는 없지만 코드를 짜는 과정에서 헷갈리는 문제였다.

간결한 풀이

#include <iostream>
#include <algorithm>
#define MAX 101
using namespace std;

int main(){
    ios::sync_with_stdio(0); cin.tie(0); cout.tie(0);
    int n, m, arr[MAX];
    cin >> n >> m;
    for(int i=1; i<=n; i++) arr[i] = i;
    while(m--){
        int begin, end, mid;
        cin >> begin >> end >> mid;
        rotate(arr+begin, arr+mid, arr+end+1);
    }

    for(int i=1; i<=n; i++) cout << arr[i] << ' ';
    return 0;
}
//https://nyeoungkm.tistory.com/entry/%EB%B0%B1%EC%A4%80c-10812%EB%B2%88-%EB%B0%94%EA%B5%AC%EB%8B%88-%EC%88%9C%EC%84%9C-%EB%B0%94%EA%BE%B8%EA%B8%B0

Rotate라는 함수를 이용하면 짧게 코드를 구성할 수 있었다. 자주 쓰이는 함수는 아닌 것 같다.

https://cplusplus.com/reference/algorithm/rotate/

728x90