※ 글쓴이는 취미로 코딩을 익혀보는 사람이라 정확하지 않은 내용을 담고 있을 수 있다 ※
이번에 볼 문제는 백준 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;
}
'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 |