Algorithm
[Algorithm] μμ μ€μΌμ€λ§
yevdev
2021. 10. 13. 10:54
π‘μμ μ€μΌμ€λ§
- μνν΄μΌν λ€μμ Jobμ μ£Όμ΄μ§ λͺ©μ μλ°λΌ μ΄λ»κ² μνν μ§λ₯Ό κ²°μ νλ λ¬Έμ
- μ£Όμ΄μ§ λͺ©μ μλ°λΌ μμ μ€μΌμ€λ§μ λ€μνκ² μ μν μ μλ€.
- μ΄λ¬ν λ¬Έμ λ€μ λλΆλΆ NP-hardλ¬Έμ μ΄λ, μΌλΆ λͺ©μ μ λν΄μ λλ λ¬Έμ λ₯Ό λ¨μν μν¬ κ²½μ° polynomial timeμ ν΄κ²°ν μ μλ€.
π‘μμ μ€μΌμ€λ§ λ¬Έμ
- μμ μ μνμκ°μ΄ μ€λ³΅λμ§ μλλ‘ λͺ¨λ μμ μ κ°μ₯ μ μ μμ κΈ°κ³μ λ°°μ νλ λ¬Έμ μ΄λ€.
- nκ°μ κ°μμ μ μμμκ°κ³Ό μ’ λ£μκ°μ΄ μλ€.
- μ£Όμ΄μ§ λ¬Έμ μμ
- μμ μ μ
- κ° μμ μ μμκ³Ό μ’ λ£μκ° : μ΄λ μ ν΄μ Έ μμΌλ―λ‘ μμ μ κΈΈμ΄λ μ£Όμ΄μ§ κ²μ΄ λλ€.
- μκ°μκ°, μ’
λ£μκ°, μμ
μ κΈΈμ΄μ λν΄ κ·Έλ¦¬λ μκ³ λ¦¬μ¦μ μκ°ν΄ λ³Ό μ μλλ°
- λΉ λ₯Έ μμμκ° μμ μ°μ λ°°μ
- λΉ λ₯Έ μ’ λ£μκ° μμ μ°μ λ°°μ
- μ§§μ μμ μ°μ λ°°μ
- κΈ΄ μ‘μ μ°μ λ°°μ
- μ΄μ€ 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
μμΈκ³ΌνκΈ°μ λνκ΅ μ»΄ν¨ν°κ³΅νκ³Ό μκ³ λ¦¬μ¦ μμ