[c/c++] 백준 10812(Bronze 2)

은동·2023년 3월 8일
0

Baekjoon

목록 보기
37/49

🔨 문제

https://www.acmicpc.net/problem/10812

도현이는 바구니를 총 N개 가지고 있고, 각각의 바구니에는 1번부터 N번까지 번호가 순서대로 적혀져 있다. 바구니는 일렬로 놓여져 있고, 가장 왼쪽 바구니를 1번째 바구니, 그 다음 바구니를 2번째 바구니, ..., 가장 오른쪽 바구니를 N번째 바구니라고 부른다.

도현이는 앞으로 M번 바구니의 순서를 회전시키려고 만들려고 한다. 도현이는 바구니의 순서를 회전시킬 때, 순서를 회전시킬 범위를 정하고, 그 범위 안에서 기준이 될 바구니를 선택한다. 도현이가 선택한 바구니의 범위가 begin, end이고, 기준이 되는 바구니를 mid라고 했을 때, begin, begin+1, ..., mid-1, mid, mid+1, ..., end-1, end 순서로 되어있는 바구니의 순서를 mid, mid+1, ..., end-1, end, begin, begin+1, ..., mid-1로 바꾸게 된다.

바구니의 순서를 어떻게 회전시킬지 주어졌을 때, M번 바구니의 순서를 회전시킨 다음, 바구니에 적혀있는 번호를 가장 왼쪽 바구니부터 출력하는 프로그램을 작성하시오.


🔨 해결방법

예를 들어
1 2 3 4 5 6 7 8 9 10 이렇게 10개의 바구니가 있고, 입력이 1 6 4 로 주어진다면 바구니를 회전시킨 결과는 4 5 6 1 2 3 7 8 9 10이 된다. 따라서 mid 인덱스의 값을 begin에다가 옮기는 것인데 무턱대고 옮겨버리면 원래의 값을 잃을 수 있으므로 (ex, 4 5 6 4 5 6 7 8 9 10) 먼저 기존 바구니의 인덱스에 위치한 값을 저장했다.

그리고 바구니의 회전은 begin 인덱스부터 변화되므로 이를 따로 start변수에 넣어서 begin을 기점으로 계속 증가시켜 바구니의 회전값을 넣어주는 식으로 코드를 작성했다.


🔨 코드

#include <iostream>
using namespace std;

int main() {

    int n, m;
    cin >> n >> m;
    int arr[101];
    for (int i = 1; i <= 100; i++) {
        arr[i] = i;
    }
    int begin, end, mid;
    for (int i = 0; i < m; i++) {

        cin >> begin >> end>> mid;
        int start = begin;  // 입력마다 시작인덱스 저장해서 계속 증가시킴
        int brr[101] = { 0 };
        for (int j = begin;j<mid;j++) {
            brr[j] = arr[j];    // 기존의 값 미리 저장
        }
        int cnt = 0;
        for (int j = mid; j <= end; j++) {
            arr[start] = arr[j];    // 바구니 회전
            start++;    
        }
       
        for (int j = begin; j < mid; j++) {
            arr[start] = brr[j];
            start++;
        }
        
    }

    for (int i = 1; i <= n; i++) {
        cout << arr[i] << ' ';
    }
    return 0;

}
profile
자자 선수입장~

0개의 댓글