https://www.acmicpc.net/problem/10811
도현이는 바구니를 총 N개 가지고 있고, 각각의 바구니에는 1번부터 N번까지 번호가 순서대로 적혀져 있다.
도현이는 앞으로 M번 바구니의 순서를 역순으로 만들려고 한다. 도현이는 한 번 순서를 역순으로 바꿀 때, 순서를 역순으로 만들 범위(i,j)를 정하고, 그 범위에 들어있는 바구니의 순서를 역순으로 만든다.
바구니의 순서를 어떻게 바꿀지 주어졌을 때, M번 바구니의 순서를 역순으로 만든 다음, 바구니에 적혀있는 번호를 가장 왼쪽 바구니부터 출력하는 프로그램을 작성하시오.
'단계별로 풀어보기'의 '1차원 배열'에 해당하는 재밌는 문제이다.
나는 주어진 인덱스의 범위를 좁혀가며 바구니를 뒤집어줬다
여기에서 사용한 함수는 swap()
cin >> a >> b; // 역순으로 바꿀 바구니 인덱스
swap(arr[a], arr[b]);
while (1) {
a++; //범위를 좁힘
b--;
if (a > b || a == b) { // 해당 인덱스가 오름차순이 아니거나 같아진다면 종료
break;
}
else swap(arr[a], arr[b]);
}
#include <iostream>
#include <algorithm>
using namespace std;
int main() {
int n, m;
cin >> n >> m;
int arr[101];
for (int i = 1; i <= 100; i++) {
arr[i] = i;
}
for (int i = 0; i < m; i++) {
int a, b;
cin >> a >> b;
swap(arr[a], arr[b]);
while (1) {
a++;
b--;
if (a > b || a == b) {
break;
}
else swap(arr[a], arr[b]);
}
}
for (int i = 1; i <= n; i++) {
cout << arr[i] << ' ';
}
return 0;
}