PS

[백준] 1700번 멀티탭 스케줄링 C++

Eastplanet 2022. 6. 30. 11:29

문제 출처: 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;


}