https://www.acmicpc.net/problem/29615
문제
민규와 친구들은 바로 옆에 붙어있는 두 빌라, 알파빌과 베타빌에 살고 있다. 이 두 빌라 중 알파빌은 싼값에 좋은 빌라라서 너무 인기가 많아 입주하려는 사람들이 줄을 선다. 민규의 친구들 역시 대기 번호를 받아 알파빌의 대기 명단에 적혀있다. 알파빌 입주에 실패한 친구들은 어쩔 수 없이 조금 더 비싼 베타빌에 들어가게 될 것이다. 이를 안타까워한 민규는 더 많은 친구를 알파빌에 입주시키기 위해 집주인 몰래 대기 명단을 바꾸려고 한다.
대기 명단에는 입주하려는 사람들의 대기 번호가 입주하는 순서대로 왼쪽에서 오른쪽으로 적혀 있으며, 대기 번호는 1번부터 N번까지의 서로 다른 정수이다.
민규는 한 번 명단을 바꿀 때 번호 두 개를 선택해서 서로 위치를 교환할 수 있다. 대기 명단을 너무 많이 바꾸면 집주인이 눈치를 챌 수 있기 때문에, 민규는 가능한 한 최소한으로 명단을 바꾸려고 한다. 민규의 모든 친구가 친구가 아닌 사람들보다 먼저 입주하도록 명단을 바꿀 때, 최소 교환 횟수를 출력하자.
입력
첫 번째 줄에 대기 명단에 적힌 수의 개수 N과 민규 친구의 수 M이 공백으로 구분되어 주어진다. (1 ≤ M ≤ N ≤ 1000)
두 번째 줄에 대기 명단에 적힌 N개의 정수가 주어진다.
세 번째 줄에 민규 친구의 대기 번호를 나타내는 M개의 정수가 주어진다.
출력
모든 친구들이 먼저 입주할 수 있도록 명단을 바꾸는 최소 횟수를 출력한다.
문제 풀이
그리디 문제.
모든 친구들이 먼저 입주하도록 해야하므로 앞에서부터 M명 중 친구가 아닌 사람과 M명 안에 들지 못한 친구와 1대 1로 교환을 진행하면 된다.
아래는 코드.
#include <iostream>
using namespace std;
int main()
{
cin.tie(NULL);
ios::sync_with_stdio(false);
int N, M, num;
cin >> N >> M;
int* arr = new int[N];
bool* isFriend = new bool[1001];
int answer = 0;;
for (int i = 0; i < 1001; i++)
{
isFriend[i] = false;
}
for (int i = 0; i < N; i++)
{
cin >> arr[i];
}
for (int i = 0; i < M; i++)
{
cin >> num;
isFriend[num] = true;
}
for (int i = 0; i < M; i++)
{
int waitNum = arr[i];
if (isFriend[waitNum] == false)
{
answer++;
}
}
cout << answer << "\n";
return 0;
}
'알고리즘 > 백준' 카테고리의 다른 글
[백준 16434] 드래곤 앤 던전 (C++) (0) | 2025.03.28 |
---|---|
[백준 1337] 올바른 배열 (C++) (0) | 2025.03.26 |
[백준 2665] 미로만들기 (C++) (0) | 2025.03.20 |
[백준 15810] 풍선 공장 (C++) (0) | 2025.03.18 |
[백준 32403] 전구 주기 맞추기 (C++) (0) | 2025.03.16 |