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라는 함수를 이용하면 짧게 코드를 구성할 수 있었다. 자주 쓰이는 함수는 아닌 것 같다.
728x90
'Algorithm' 카테고리의 다른 글
[백준/C++] 11047 동전0 (S4) (0) | 2023.10.17 |
---|---|
[백준/C++] 25206 너의 평점은 (S5) (1) | 2023.10.17 |
[백준/C++] 1535 안녕 (S2) (0) | 2023.10.16 |
[백준/C++] 12865 평범한 배낭 (G5) (0) | 2023.10.16 |
[백준/C++] 1920 수 찾기 (S4) (0) | 2023.10.16 |