Algorithm

[Algorithm] ์ž‘์—… ์Šค์ผ€์ค„๋ง

yevdev 2021. 10. 13. 10:54

๐Ÿ’ก์ž‘์—…์Šค์ผ€์ค„๋ง

  • ์ˆ˜ํ–‰ํ•ด์•ผํ•  ๋‹ค์ˆ˜์˜ Job์„ ์ฃผ์–ด์ง„ ๋ชฉ์ ์—๋”ฐ๋ผ ์–ด๋–ป๊ฒŒ ์ˆ˜ํ–‰ํ• ์ง€๋ฅผ ๊ฒฐ์ •ํ•˜๋Š” ๋ฌธ์ œ
  • ์ฃผ์–ด์ง„ ๋ชฉ์ ์—๋”ฐ๋ผ ์ž‘์—…์Šค์ผ€์ค„๋ง์„ ๋‹ค์–‘ํ•˜๊ฒŒ ์ •์˜ํ•  ์ˆ˜ ์žˆ๋‹ค. 
  • ์ด๋Ÿฌํ•œ ๋ฌธ์ œ๋“ค์€ ๋Œ€๋ถ€๋ถ„ NP-hard๋ฌธ์ œ์ด๋‚˜, ์ผ๋ถ€ ๋ชฉ์ ์— ๋Œ€ํ•ด์„œ ๋˜๋Š” ๋ฌธ์ œ๋ฅผ ๋‹จ์ˆœํ™” ์‹œํ‚ฌ ๊ฒฝ์šฐ polynomial time์— ํ•ด๊ฒฐํ•  ์ˆ˜ ์žˆ๋‹ค.

 

๐Ÿ’ก์ž‘์—…์Šค์ผ€์ค„๋ง ๋ฌธ์ œ

  • ์ž‘์—…์˜ ์ˆ˜ํ–‰์‹œ๊ฐ„์ด ์ค‘๋ณต๋˜์ง€ ์•Š๋„๋ก ๋ชจ๋“  ์ž‘์—…์„ ๊ฐ€์žฅ ์ ์€ ์ˆ˜์˜ ๊ธฐ๊ณ„์— ๋ฐฐ์ •ํ•˜๋Š” ๋ฌธ์ œ์ด๋‹ค.
  • n๊ฐœ์˜ ๊ฐ์ž‘์—…์€ ์‹œ์ž‘์‹œ๊ฐ„๊ณผ ์ข…๋ฃŒ์‹œ๊ฐ„์ด ์žˆ๋‹ค.
  • ์ฃผ์–ด์ง„ ๋ฌธ์ œ์š”์†Œ
    1. ์ž‘์—…์˜ ์ˆ˜
    2. ๊ฐ ์ž‘์—…์˜ ์‹œ์ž‘๊ณผ ์ข…๋ฃŒ์‹œ๊ฐ„ : ์ด๋Š” ์ •ํ•ด์ ธ ์žˆ์œผ๋ฏ€๋กœ ์ž‘์—…์˜ ๊ธธ์ด๋„ ์ฃผ์–ด์ง„ ๊ฒƒ์ด ๋œ๋‹ค.
  • ์‹œ๊ฐ์‹œ๊ฐ„, ์ข…๋ฃŒ์‹œ๊ฐ„, ์ž‘์—…์˜ ๊ธธ์ด์— ๋Œ€ํ•ด ๊ทธ๋ฆฌ๋”” ์•Œ๊ณ ๋ฆฌ์ฆ˜์„ ์ƒ๊ฐํ•ด ๋ณผ ์ˆ˜ ์žˆ๋Š”๋ฐ
    1. ๋น ๋ฅธ ์‹œ์ž‘์‹œ๊ฐ„ ์ž‘์—… ์šฐ์„  ๋ฐฐ์ •
    2. ๋น ๋ฅธ ์ข…๋ฃŒ์‹œ๊ฐ„ ์ž‘์—… ์šฐ์„  ๋ฐฐ์ •
    3. ์งง์€ ์ž‘์—… ์šฐ์„  ๋ฐฐ์ •
    4. ๊ธด ์žก์—… ์šฐ์„  ๋ฐฐ์ •
  • ์ด์ค‘ 1๋ฒˆ์งธ ์•Œ๊ณ ๋ฆฌ์ฆ˜๋งŒ์ด ์ตœ์ ํ•ด๋ฅผ ์ฐพ์„ ์ˆ˜ ์žˆ๋‹ค.

 

๐Ÿ’ก์˜์‚ฌ์ฝ”๋“œ

  • ์ž…๋ ฅ : n๊ฐœ์˜ ์ž‘์—… t1~tn
  • ์ถœ๋ ฅ : ๊ฐ ๊ธฐ๊ณ„์— ๋ฐฐ์ •๋œ ์ž‘์—… ์ˆœ์„œ
  • 1. ์‹œ์ž‘ ์‹œ๊ฐ„์˜ ์˜ค๋ฆ„์ฐจ์ˆœ์œผ๋กœ ์ •๋ ฌํ•œ ์ž‘์—… ๋ฆฌ์ŠคํŠธ L
    2. while(L!=∅){
    3. 	L์—์„œ ๊ฐ€์žฅ ์ด๋ฅธ ์‹œ์ž‘์‹œ๊ฐ„์˜ ์ž‘์—… ti๋ฅผ ๊ฐ€์ ธ์˜จ๋‹ค.
    4. 	if(ti๋ฅผ ์ˆ˜ํ–‰ํ•  ๊ธฐ๊ณ„๊ฐ€ ์žˆ๋‹ค๋ฉด)
    5. 		ti๋ฅผ ์ˆ˜ํ–‰ํ•  ์ˆ˜ ์žˆ๋Š” ๊ธฐ๊ณ„์— ๋ฐฐ์ •ํ•œ๋‹ค.
    6. 	else
    7. 		์ƒˆ๋กœ์šด ๊ธฐ๊ณ„์— ti๋ฅผ ๋ฐฐ์ •ํ•œ๋‹ค.
    8. 	ti๋ฅผ L์—์„œ ์ œ๊ฑฐํ•œ๋‹ค.
    }
    9. return ๊ฐ ๊ธฐ๊ณ„์— ๋ฐฐ์ •๋œ ์ž‘์—… ์ˆœ์„œ

 

 

๐Ÿ’กC++ ์ฝ”๋“œ

#include <iostream>
#include <vector> // ๋ฒกํ„ฐ ๋ฆฌ์ŠคํŠธ์‹œ ์‚ฌ์šฉ
#include <utility> // ์ž…๋ ฅ๊ฐ’ -> ๋ฒกํ„ฐ๋ฆฌ์ŠคํŠธ ํ•œ์Œ์œผ๋กœ
#include <algorithm>

using namespace std;

#define X first
#define Y second

// ์ž…์ถœ๋ ฅ ์†๋„ ๊ฐœ์„ 
#define IOFAST ios::sync_with_stdio(0), cin.tie(0), cout.tie(0);

vector<pair<int,int> > task;
vector< vector<int> > machine;
int nMachine = 0;

int Operating(int start)
{
    int i;
    // ์—…๋ฌด๊ฐ€ ํ• ๋‹น๋œ ๊ธฐ๊ณ„๊ฐ€ ์กด์žฌํ•˜๋Š” ๊ฒฝ์šฐ
    if (nMachine > 0)
    {
        for (i = 0; i < nMachine; i++)
        {
            // ์—…๋ฌด๋ฅผ ์ˆ˜ํ–‰ํ•˜๊ณ  ์žˆ๋Š” ๊ธฐ๊ณ„๊ฐ€ ์žˆ๊ณ ,
            // ๊ทธ ๊ธฐ๊ณ„๊ฐ€ ๋‹ค์Œ ์—…๋ฌด๋ฅผ ์ˆ˜ํ–‰ํ•  ์ˆ˜ ์žˆ๋Š” ๊ฒฝ์šฐ ํ•ด๋‹น ๊ธฐ๊ณ„๋ฅผ ๋ฐฐ์น˜
            if (machine[i].size() > 0 && task[machine[i].back()].second <= start)
            {
                return i;
            }
        }
 
        // ์—…๋ฌด๋ฅผ ์ˆ˜ํ–‰ํ• ๋งŒํ•œ ๊ธฐ๊ณ„๊ฐ€ ์—†์œผ๋ฉด ์ƒˆ ๊ธฐ๊ณ„๋ฅผ ๋ฐฐ์น˜
        nMachine++;
        return i;
    }
    // ์—…๋ฌด๊ฐ€ ํ• ๋‹น๋œ ๊ธฐ๊ณ„๊ฐ€ ์กด์žฌํ•˜์ง€ ์•Š๋Š” ๊ฒฝ์šฐ
    else
    {
        nMachine++;
        return 0;
    }
}
 
void Scheduling(int nTask)
{
    int i = 0;
    while (i < nTask)
    {
        // ๊ธฐ๊ณ„ ๋ฒˆํ˜ธ๋ฅผ ํ• ๋‹น ๋ฐ›๊ณ ,
        // ํ•ด๋‹น ๊ธฐ๊ณ„์— ์—…๋ฌด ๋ฐฐ์ •
        int machineNum=Operating(task[i].first);
        machine[machineNum].push_back(i);
        i++;
    }
}


int main(){
    IOFAST;
    int N;  // ์ž‘์—…์˜ ์ˆ˜
    
    cin >> N;
    cin.ignore();

    for(int i=0;i<N;i++){
        int a,b;
        cin >> a >> b ;
        task.push_back(make_pair(a,b));
    }

    for (int i = 0; i < N; i++)
    {
        vector<int> element(0);
        machine.push_back(element);
    }

    sort(task.begin(), task.end());
    
    Scheduling(task.size());

    cout<<nMachine;
}

 

โฐ์‹œ๊ฐ„๋ณต์žก๋„

  • Line1 : O(nlogn)
  • while-๋ฃจํ”„์—์„œ๋Š” ์ž‘์—…์„ L์—์„œ ๊ฐ€์ ธ๋‹ค๊ฐ€ ์ˆ˜ํ–‰๊ฐ€๋Šฅํ•œ ๊ธฐ๊ณ„๋ฅผ ์ฐพ์•„์„œ ๋ฐฐ์ •ํ•˜๋Š” ์‹œ๊ฐ„ : O(m) (m์€ ์‚ฌ์šฉ๋œ ๊ธฐ๊ณ„์˜ ํšŸ์ˆ˜)
  • while๋ฃจํ”„๊ฐ€ ์ˆ˜ํ–‰๋œ ์ด ํšŸ์ˆ˜๊ฐ€ n๋ฒˆ์ด๋ฏ€๋กœ, line2~9๊นŒ์ง€๋Š” O(m)xn = O(nm)
  • ๋”ฐ๋ผ์„œ, O(nlogn) + O(mn)

โžฐ์‘์šฉ

  • ๋น„์ฆˆ๋‹ˆ์Šค ํ”„๋กœ์„ธ์‹ฑ
  • ๊ณต์žฅ ์ƒ์‚ฐ ๊ณต์ •
  • ๊ฐ•์˜์‹ค/์„ธ๋ฏธ๋‚˜ ๋ฃธ ๋ฐฐ์ •
  • ์ปดํ“จํ„ฐ ํƒœ์Šคํฌ ์Šค์ผ€์ค„๋ง

Reference

์„œ์šธ๊ณผํ•™๊ธฐ์ˆ ๋Œ€ํ•™๊ต ์ปดํ“จํ„ฐ๊ณตํ•™๊ณผ ์•Œ๊ณ ๋ฆฌ์ฆ˜ ์ˆ˜์—