[백준] 구현 10811번: 바구니 뒤집기

C.K. ·2022년 6월 4일
1

baekjoon

목록 보기
9/67

문제

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

도현이는 앞으로 M번 바구니의 순서를 역순으로 만들려고 한다. 도현이는 한 번 순서를 역순으로 바꿀 때, 순서를 역순으로 만들 범위를 정하고, 그 범위에 들어있는 바구니의 순서를 역순으로 만든다.

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

입력

첫째 줄에 N (1 ≤ N ≤ 100)과 M (1 ≤ M ≤ 100)이 주어진다.

둘째 줄부터 M개의 줄에는 바구니의 순서를 역순으로 만드는 방법이 주어진다. 방법은 i j로 나타내고, 왼쪽으로부터 i번째 바구니부터 j번째 바구니의 순서를 역순으로 만든다는 뜻이다. (1 ≤ i ≤ j ≤ N)

도현이는 입력으로 주어진 순서대로 바구니의 순서를 바꾼다.

출력

모든 순서를 바꾼 다음에, 가장 왼쪽에 있는 바구니부터 바구니에 적혀있는 순서를 공백으로 구분해 출력한다.

Approach

쉬울거라 생각했는데 상당히 애먹은 문제...

  • swap함수를 구현해서 주어진 범위 동안 반복해서 swap함으로써 역순으로 바꿈
  1. n개의 바구니를 담는 배열 정의
  2. m번동안 범위 입력받고 주어진 범위 동안 원소들 swap
  3. 바뀐 배열을 출력

Source Code

// Online C++ compiler to run C++ program online
#include <iostream>
#include <string>
#include <bits/stdc++.h>
using namespace std;

// swap함수 구현
void swap(int &a, int &b)
{
    int temp = a;
    a = b;
    b = temp;
}


int main() {
    
    // n, m 입력받기
    int n, m;
    cin >> n >> m;
    
    // n개의 바구니를 담는 배열 정의
    int arr[n];
    for (int i = 0; i < n; i++)
    {
        arr[i] = i + 1;
    }
    
	// m번 동안 바구니가 바뀔 순서 입력 받기
    for (int j = 0; j < m; j++)
    {
    	// 바구니를 역순으로 바꾸는 범위 입력 받기 
        int start, end;
        cin >> start >> end;
        // 인덱스를 맞추기 위해 -1씩 (바구니를 1번째부터 세기 때문!)
        start--;
        end--;
        // 주어진 범위동안 swap
        for (int k = end; k > start; k--)
        {
            for (int z = start; z < k; z++)
            {
                swap(arr[z], arr[z+1]);
            }
        }
    }
    
    // 순서가 다 바뀐 배열 출력
    for (int q = 0; q < n; q++)
    {
        cout << arr[q] << " ";
    }
    
    
    return 0;
}

버블 소트에 쓰이는 반복문과 유사하게 작성해보았다.

profile
1일 1알고리즘

0개의 댓글