[백준] 1700번 멀티탭 스케줄링 C++
문제 출처: https://www.acmicpc.net/problem/1700
1700번: 멀티탭 스케줄링
기숙사에서 살고 있는 준규는 한 개의 멀티탭을 이용하고 있다. 준규는 키보드, 헤어드라이기, 핸드폰 충전기, 디지털 카메라 충전기 등 여러 개의 전기용품을 사용하면서 어쩔 수 없이 각종 전
www.acmicpc.net
콘센트가 empty하다면 -> 전기용품 연결 후 continue;
콘센트가 empty하지 않다면 -> 현재 사용할 전기용품이 연결되어 있는지 검사
연결 되어 있다 -> 그대로 사용하면 되므로 continue;
연결 되어 있지 않다 -> 콘센트를 전부 쓰지 않았다면 전기용품 연결 후 conitnue;
-> 콘센트를 전부 썻다면 뽑을 콘센트를 결정해야함
뽑을 콘센트 결정 방법
현재 연결 해놓은 콘센트들 중 가장 미래에 사용될(혹은 미래에 사용되지 않는) 전기용품을 선택한다.
2 7
2 3 2 3 1 2 7
2-3-2-3-1-2-7이 순서대로 들어올 때
2 콘센트가 empty하므로 2 연결 , 콘센트 상황 : 2
3 콘센트를 전부 쓰지 않고 있으므로 연결 , 콘센트 상황 : 2 3
2 이미 연결되어 있으므로 그대로 사용 , 콘센트 상황: 2 3
3 이미 연결되어 있으므로 그대로 사용 , 콘센트 상황: 2 3
1 콘센트를 전부 사용하고 있으므로 뽑을 콘센트를 정해야함, 현재 연결된 2, 3 중 가장 미래에 사용(혹은 사용하지 않는) 전기용품은 3 이므로 3을 뽑고 1을 연결, 콘센트 상황: 1 2
2 이미 연결되어 있으므로 그대로 사용 , 콘센트 상황: 1 2
7 뽑을 콘센트를 결정하여 1 혹은 2를 뽑음
#include<iostream>
#include<algorithm>
#include<vector>
#include<queue>
#include <string>
using namespace std;
int main() {
ios::sync_with_stdio(false); cin.tie(NULL); cout.tie(NULL);
int N;
cin >> N;
int K;
cin >> K;
int arr[101];
int search[101];
for (int i = 0; i < K; i++)cin >> arr[i];
int count = 0;
vector <int> v;
for (int i = 0; i < K; i++) {
if (v.empty()) {
v.push_back(arr[i]);
continue;
}
else {
int flag = 0;
for (int item : v) {
if (item == arr[i]) {
flag = 1;
}
}
if(flag==1)continue;
}
if (v.size() != N) {
v.push_back(arr[i]);
continue;
}
else {
fill(&search[0], &search[101], 1000);
for (int j = i; j < K; j++) {
if(search[arr[j]] > j)search[arr[j]] = j;
}
int max = 0;
int maxIdx;
for (int item : v) {
if (max < search[item]) {
max = search[item];
maxIdx = item;
}
}
for (int j = 0; j < v.size();j++) {
if (v[j] == maxIdx) {
v.erase(v.begin() + j);
count++;
v.push_back(arr[i]);
break;
}
}
}
}
cout << count;
}