※ 글쓴이는 취미로 코딩을 익혀보는 사람이라 정확하지 않은 내용을 담고 있을 수 있다 ※

 

이번에 볼 문제는 백준 6130번 문제인 Privileged Cows이다.
문제는 아래 링크를 확인하자.

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

 

6130번: Privileged Cows

Depending on their milk output, each of the N (1 <= N <= 1,000) cows is assigned a 'privilege number' of 1, 2, or 3 that dictates whether they get to drink water at the well earlier (privilege number 1) or later. The cows, of course, never remember their p

www.acmicpc.net

주어진 소들을 1 1 ... 2 2 ... 3 3 꼴로 다시 세울 때 필요한 swap 연산의 횟수의 최솟값을 구하는 문제이다.

 

주어진 소들의 위치를 단순히 정렬하는 것으로 최종적으로 있어야 하는 소의 배열을 구할 수 있다.

 

초기 배열과 최종적으로 있어야 하는 소의 배열을 보고, privilege A인 소가 있는 위치이지만 최종적으로 privilege B인 소가 위치해야하는 각 경우의 수 pAB를 구하자.

 

swap 한번으로 두 소가 모두 자기 위치로 갈 수 있는 소의 쌍을 우선적으로 모두 제자리로 보내고(p12와 p21, p23과 p32, p31과 p13), 남은 소들은 셋씩 묶어 swap 두번으로 세 마리의 소의 쌍(p12, p23, p31 / p13, p32, p21)을 제자리로 보내 문제를 해결하자.

 

둘씩 소들을 묶어 swap한 뒤의 남은 소들은 항상 위와 같이 셋씩 묶일 수 있다는 것을 증명하는 것은 읽는이들의 생각해볼 거리로 남겨둔다.

 

아래는 제출한 소스코드이다.

#include <iostream>
#include <algorithm>
using namespace std;

int N;
int arr1[1000];
int arr2[1000];
int ab, bc, ca, ac, cb, ba;

int main() {
	ios::sync_with_stdio(0);
	cin.tie(0);

	cin >> N;
	for (int i = 0; i < N; i++) {
		int x; cin >> x;
		arr1[i] = arr2[i] = x;
	}
	sort(arr2, arr2 + N);

	for (int i = 0; i < N; i++) {
		if (arr1[i] == arr2[i]) continue;

		if (arr1[i] == 1 && arr2[i] == 2) ab++;
		else if (arr1[i] == 2 && arr2[i] == 3) bc++;
		else if (arr1[i] == 3 && arr2[i] == 1) ca++;
		else if (arr1[i] == 1 && arr2[i] == 3) ac++;
		else if (arr1[i] == 3 && arr2[i] == 2) cb++;
		else ba++;
	}

	int ans = 0;
	int tmp;
	tmp = min(ab, ba);
	ans += tmp, ab -= tmp, ba -= tmp;
	tmp = min(bc, cb);
	ans += tmp, bc -= tmp, cb -= tmp;
	tmp = min(ca, ac);
	ans += tmp, ca -= tmp, ac -= tmp;

	cout << ans + ab * 2 + ba * 2;
}
728x90

'BOJ' 카테고리의 다른 글

[BOJ 25288 // C++] 영어 시험  (0) 2022.09.14
[BOJ 6131 // C++] 완전 제곱수  (0) 2022.09.13
[BOJ 6129 // C++] Obstacle Course  (0) 2022.09.11
[BOJ 6128 // C++] Bessie's Secret Pasture  (0) 2022.09.10
[BOJ 6127 // C++] Super Paintball  (0) 2022.09.09

+ Recent posts