문제설명

 

소스코드

#include <iostream>
using namespace std;
int main() {
	int N; int M;
	cin >> N >> M;
	int* arr = new int[N]; //동적 할당
	int a; int b;
	for (int i = 0; i < N; ++i) arr[i] = i + 1; //배열 초기화
	for (int i = 0; i < M; ++i)
	{
		cin >> a >> b;
		for (int j = 0; j <= (b - a) / 2; ++j)
		{
			int tmp = 0;
			tmp = arr[j + a - 1];
			arr[j + a - 1] = arr[b - j - 1];
			arr[b - j - 1] = tmp;
		}
	}
	for (int i = 0; i < N; ++i) cout << arr[i] << " ";
}

 

풀이

  • 1부터 N까지 수 중에서 i부터 j까지의 수를 역순으로 M번 정렬한다.

내가 작성한 소스코드는 기본적으로 swap 알고리즘을 기초로 만들어졌다.

swap알고리즘의 내용 이전에 내가 작성한 https://rebugs.tistory.com/143 에서 확인할 수 있다.

 

[JAVA] 배열 요소를 역순으로 정렬하는 알고리즘

Do it! 자료구조와 함께 배우는 알고리즘 입문[자바편] 연습문제와 실습문제입니다. 배열의 요소가 1, 2, 3, 4, 5, 6, 7 이렇게 7개 있다고 하면 역순으로 정렬하면 7, 6, 5, 4, 3, 2, 1이다. 그림에서 보는

rebugs.tistory.com

위 포스팅의 응용버전이 이번 문제인 것 같다.

자세한 스왑 과정을 확인하려면 아래와 같은 코드로 과정을 지켜보면 된다.

#include <iostream>
using namespace std;
int main() {
	int N; int M;
	cin >> N >> M;
	int* arr = new int[N];
	int a; int b;
	for (int i = 0; i < N; ++i) arr[i] = i + 1;
	for (int i = 0; i < M; ++i)
	{
		cin >> a >> b;
		for (int j = 0; j <= (b - a) / 2; ++j)
		{
			int tmp = 0;
			tmp = arr[j + a - 1];
			cout << arr[j + a - 1] << "와 " << arr[b - j - 1] << "를 바꿉니다." << endl;
			arr[j + a - 1] = arr[b - j - 1];
			arr[b - j - 1] = tmp;
		}
		for (int i = 0; i < N; ++i) cout << arr[i] << " ";
		cout << endl;
	}
	for (int i = 0; i < N; ++i) cout << arr[i] << " ";
}