Transcript Document

거스름돈 문제
스케줄 짜기
그래프 색칠하기
보기: 거스름돈 문제
• 문제: 동전의 개수가 최소가 되도록 거스름 돈을 주는 문제
• 탐욕적인 알고리즘
– 거스름돈을 x라 하자.
– 먼저, 가치가 가장 높은 동전부터 x가 초과되지 않도록
계속 내준다.
– 이 과정을 가치가 높은 동전부터 내림순으로 총액이
정확히 x가 될 때까지 계속한다.
• 현재 우리나라에서 유통되고 있는 동전만을 가지고, 이
알고리즘을 적용하여 거스름돈을 주면, 항상 동전의 개수는
최소가 된다. 따라서 이 알고리즘은 최적(optimal)!
최적의 해를 얻지 못하는 경우
• 12원 짜리 동전을 새로 발행했다고 하자.
• 이 알고리즘을 적용하여 거스름돈을 주면, 항상 동전의
개수는 최소가 된다는 보장이 없다.
• 보기: 거스름돈 액수 = 16원
– 탐욕알고리즘의 결과: 12원  1개 = 12원, 1원  4개
= 4원
– 동전의 개수 = 5개  최적(optimal)이 아님!
– 최적의 해: 10원  1개, 5원  1개, 1원  1개가 되어
동전의 개수는 3개가 된다.
스케줄 짜기
• 문제: 기다리고 머리 하는 데 걸리는 시간이 최소가
되도록 스케줄 짜기(미용사 한 사람)
• 시스템 내부 시간
– 기다리고 머리 하는 데 걸리는 시간
– 이 시간을 최소로 하기
예제 4.2 시스템 내부의 총 시간의 최소화
• 작업이3개와 걸리는 시간 : t1 = 5, t2 = 10, t3 = 4
• 작업 순서를 1, 2, 3으로 스케줄을 짜면 완료 까지 걸리는 시간
5 + (5 + 10) + (5 + 10 + 4) = 39
• 모든 스케줄과 완료 까지 걸리는 시간
스케줄
[1,2,3]
[1,3,2]
[2,1,3]
[2,3,1]
[3,1,2]
[3,2,1]
걸리는 시간
5 + ( 5 + 10) + (5 + 10 + 4) = 39
5 + ( 5 + 4 ) + (5 + 4 + 10) = 33
10 + (10 + 5 ) + (10 + 5 + 4) = 44
10 + (10 + 4 ) + (10 + 4 + 5) = 43
4 + ( 4 + 5 ) + (4 + 5 + 10) = 32
4 + (4 + 10) + (4 + 10 + 5) = 37
 최적의 작업 순서 : [3, 1, 2]로 걸리는 시간 총 32
알고리즘 : 시스템 내부의 총 시간의 최소화
• 문제: 기다리고 머리 하는 데 걸리는 시간이 최소가
되도록 스케줄 짜기
• 알고리즘:
작업 시간 별로 작업을 비 내림차순으로 정렬;
while(답을 구하지 못했음){
다른 작업을 스케줄에 넣는다;
if(작업이 더 이상 없다)
답을 구했음;
}
• 시간 복잡도 :
W(n) ∈ (n lg n)
마감 시간 있는 스케줄 짜기
• 각 작업을 끝내는 데 1의 단위시간이 걸리고
• 마감시간과 이익이 할당
• 작업이 마감시간 전이나 마감시간에 시작되면 그
이익을 얻는다
• 모든 작업을 스케줄에 포함시킬 필요는 없다
• 목표 : 총 이익이 최대인 작업 스케줄 짜기
예제 4.3 마감 시간이 있는 스케줄 짜기
• 작업 마감 시간, 이익
•
•
•
•
•
작업
마감시간
이익
1
2
3
4
2
1
2
1
30
35
25
40
스케줄
[1,3]
[2,1]
[2,3]
[3,1]
[4,1]
[4,3]
총 이익
30 + 25 = 55
35 + 30 = 65
35 + 25 = 60
25 + 30 = 55
40 + 30 = 70
40 + 25 = 65
작업 1은 마감시간이 2 : “작업1을 시점 1 또는 시점 2에 시작
시점 0은 존재하지 않는다
작업 2는 마감시간이 1 : “작업2는 시점 1에서만 시작
가능한 스케줄과 총 이익
불가능한 스케줄은 나열하지 않았음
ex) [1,2] : 불가능한 스케줄
[1,3] : 가능한 스케줄
 최적의 작업 순서 : [4, 1]로 총 이익 70
알고리즘 : 마감시간이 있는 스케줄 짜기
• 문제: 총 이익을 최대로 하는 적절한 순서를 찾기
• 알고리즘:
작업을 이익이 큰 것부터 차례로 정렬한다;
S = Ф;
while(답을 구하지 못했음){
다른 작업을 선택;
if(이 작업을 추가하면 S에 적절하다)
이 작업을 S에 추가;
if(더 이상 작업이 없다)
답을 구했다;
}
예제 4.4 위의 알고리즘 수행 과정
• 알고리즘 수행 절차
1. S를 Ф으로 놓는다.
2. 순서 [1]이 적절하므로 S를 {1}로 놓는다
3. 순서[2,1]이 적절하므로 S를 {1,2}로 놓는다
4. {1,2,3}은 적절한 순서가 존재하지 않으므로 기각
5. 순서[2,1,4]가 적절하므로 S를 {1,2,4}로 놓는다
6. {1,2,4,5}는 적절한 순서가 존재하지 않으므로 기각
7. {1,2,4,6}는 적절한 순서가 존재하지 않으므로 기각
8. {1,2,4,7}는 적절한 순서가 존재하지 않으므로 기각
작업 마감시간
1
2
3
4
5
6
7
 S의 최종값 : {1, 2, 4}
 적절한 순서 : [2, 1, 4] 또는 [2, 4, 1]
3
1
1
3
1
3
2
이익
40
35
30
25
20
15
10
알고리즘 : 마감시간이 있는 스케줄 짜기
• 문제: 각 작업이 마감 시간에 마칠 수 있도록 짜여진 경우에만 이익을 얻을 때, 총
•
•
이익이 최대가 되도록 스케줄 을 잡아라.
입력: 작업의 수 n 과 정수 배열 deadline(인덱스는 1 부터 n까지), 여기서
deadline[i]는 i번째 작업의 마감시간, 배열은 이익이 큰 것부터 차례로 정렬 되어
있다.
출력 : 작업의 최적 순서 J
void schedule(int n, const int deadline[], sequence_of_integer & j)
{
index I;
sequence_of_integer K;
J = [1];
for(i=2;i<=n; i++){
K = J에다 deadline[i]의 값이 작은 것부터 i를 추가
if ( K가 적절하다)
J=K;
}
}
예제 4.6
• 알고리즘 수행 절차
1. J는 [1]이 된다.
2. K는 [2,1]이 되고 , 적절하다고 결정
J는 K가 적절하므로 [2,1]이 된다
3. K는 [2,3,1]이 되고, 적절하지 않으므로 기각
4. K는 [2,1,4]가 되고, 적절하다고 결정
J는 K가 적절하므로 [2,1,4]가 된다
5. K는 [2,5,1,4]가 되고, 적절하지 않으므로 기
각
6. K는 [2,1,6,4]가 되고, 적절하지 않으므로 기
각
7. K는 [2,7,1,4]가 되고, 적절하지 않으므로 기
 J의
각 최종값 : [2, 1, 4]
작업 마감시간
1
2
3
4
5
6
7
3
1
1
3
1
3
2
그래프 색칠하기
• m - 색칠하기
• 비 방향그래프에서 서로 인접한 정점이 같은
색을 갖지 않게 최대 m개의 색 칠하는 방법
찾기
• 응용분야 : 지도 색칠하기
예제 5.5
• 2-색칠하기 : 불가능
• 3-색칠하기(6가지)
 답 중 하나
•
•
•
•
정점
색
v1
v2
v3
v4
색1
색2
색3
색2
v1
v2
v4
v3
2개의 이음선이 서로 교차되지 않도록 그린 그래프
: 평면그래프
모든 지도는 그에 상응하는 평면그래프 존재
지도에서 각 지역은 정점에 해당
한 지역이 다른 지역과 인접하면 정점들을 이음선으로
연결
평면그래프
v2
v1
v3
v4
지도
상태 공간 트리
•
•
•
•
각 수준 마다 가능한 모든 색을 시도
뿌리에서 잎까지의 경로는 각각 해답 후보
두 인접한 정점이 같은 색인지 아닌지 결정
X : 유망하지 않은 마디
시작
v1
v2
v3
v4
1
1
X
2
2
3
•
1
X
3
2
X
3
1
X
2
•
3
X
v1을 색1로 칠한 후, v2에 색1을 선택하면
: 유망하지 않다
v1, v2, v3을 색1, 색2, 색3으로 각각 칠한 후
v4 에 색1을 선택하면 : 유망하지 않다
예제 5.5
• 2-색칠하기 : 불가능
• 3-색칠하기
• 4-색칠하기
v1
v2
v2
v3
v4
v3
v1
v4
v5
v5
평면그래프
지도
그래프 색칠하기
• 문제: 비 방향그래프에서 m개의 색만 사용하여 인접한 정점이 같은
색이 되지 않게 정점을 색칠할 수 있는 모든 방법 구하기
• 입력: 양의 정수 n과 m, 그리고 n개의 정점을 가진 비 방향그래프,
그래프는 행과 열의 인덱스가 모두 1부터 n까지인 2차원 배열W로
표현.
– i번 째 정점과 j번 째 정점 사이에 이음선이 존재하면 W[i][j] : true
– 그렇지 않으면 false
• 출력: 최대로 m개의 색을 가지고 인접한 정점이 같은 색이 되지 않게
그래프에 색칠이 가능한 모든 경우. 출력은 인덱스가 1부터 n까지인
배열 vcolor
– vcolor[i]의 값 : i번 째 정점에 할당된 색
알고리즘
void m_coloring (index i)
{
int color;
if (promising(i))
if ( i == n )
cout << vcolor [i] through vcolor [n];
else
for (color = 1; color <= m ; color++) {
vcolor[i+1] = color;
m_coloring (i + 1);
}
}
알고리즘
bool promising (index i)
{
index j;
bool switch;
switch = true;
j = 1;
while (j < i && switch)
if ( W[i][j] && vcolor[i] == vcoloe[j] )
switch = false;
j++;
}
return switch ;
}
}
예제
• 2-색칠하기
• 3-색칠하기(빨간색, 녹색, 흰색)
v1
v2
v3
v4
v5
v6
평면그래프
• 색칠하는 가능한 모든 방법 다 찾기
• 실행 절차를 단계별로 보여라