[백준] 10813번 C++ 풀이

쉬운 목차

문제

10813호:랠리

도현은 총 N개의 바구니를 가지고 있고, 각 바구니는 1부터 N까지 번호가 매겨져 있습니다. 각 바구니에는 1개의 공이 들어 있으며 첫 번째 공에는 바구니에 적힌 번호와 같은 번호가 있습니다.

www.acmicpc.net


암호

#include <iostream>
#include <vector>

int main()
{
	std::ios_base::sync_with_stdio(false);
	std::cin.tie(NULL); std::cout.tie(NULL);

	int n, m;
	std::cin >> n >> m;

	std::vector<int> arr(n);
	for (int i = 0; i < n; ++i) arr(i) = i;

	while (m > 0)
	{
		int i, j;
		std::cin >> i >> j;

		int o = arr(i - 1);
		arr(i - 1) = arr(j - 1);
		arr(j - 1) = o;

		m--;
	}

	for (auto& v : arr) std::cout << v+1 << " ";
	std::cout << "\n";

	return 0;
}

설명

배열에서 두 값을 교환하는 문제는 i번째 값을 j번째 값으로, i번째 값을 j번째 값으로 바꾸는 것입니다.

이때, i를 먼저 j로 변경하고 i를 j에 저장하면 i의 값은 이미 j로 변경되었기 때문에 j의 값은 변경되지 않는다는 점에 유의해야 한다.

int i = 2, j = 3;
i = j; // i에 3이 저장됨
j = i; // j에 i값, 즉 3이 저장됨

이러한 문제가 발생하지 않도록 하기 위해 i의 값을 새로운 변수 k에 저장하고 i의 값을 갱신하여 k의 값을 j에 저장한다.

int k = i; // k에 2가 저장 됨
i = j; // i에 3이 저장 됨
j = k; // j에 2가 저장 됨

사실 C++에서 가장 쉬운 방법은 표준::스왑사용될 예정이다