19. T1. 초기화
T2. 다음 관계 T3. 관계 기록
T4. 0들을 찾는다 T5. 대기열 앞단 출력 T6. 관계들 삭제
T8. 공정 끝 T7. 대기열에서 제거
QLINK[0], COUNT[0]=QLINK[0], … COUNT[N]=QLINK[N]
P : 저장소 풀 안의 노드를 참조
F, R : 대기열 앞단과 뒷단을 가리키는 데 쓰는 정수 값
N : 출력해야 할 남은 객체 개수
20. T1. 초기화
T2. 다음 관계 T3. 관계 기록
T4. 0들을 찾는다 T5. 대기열 앞단 출력 T6. 관계들 삭제
T8. 공정 끝 T7. 대기열에서 제거
n 입력 받음.
foreach (1≤k≤n)
COUNT[k] ← 0, TOP[k] ← Λ
N←n
28. T1. 초기화
T2. 다음 관계 T3. 관계 기록
T4. 0들을 찾는다 T5. 대기열 앞단 출력 T6. 관계들 삭제
T8. 공정 끝 T7. 대기열에서 제거
출력 대기열을 QLINK 필드를 통해 연결
R ← 0, QLINK[0] ← 0
foreach (1≤k≤n)
if COUNT[k] == 0 then QLINK[R] ← k, R ← k
F ← QLINK[0]
29. QLINK[0] = 0, R = 0, N = 9
k 1 2 3 4 5 6 7 8 9
COUNT[k] 0 1 1 1 2 2 1 2 0
TOP[k]
Λ
SUC 3 8 7 6 8 4 6 5
R ← 0, Λ Λ Λ Λ Λ Λ
NEXT
QLINK[0] ← 0
foreach (1≤k≤n)
5
if COUNT[k] == 0 then QLINK[R] ← k, R ← k 2
F ← QLINK[0] Λ Λ
30. QLINK 구분이 쉽게 숫자에 밑줄 QLINK[0] = 1, R = 1, N = 9
k 1 2 3 4 5 6 7 8 9
COUNT[k] 0 1 1 1 2 2 1 2 0
TOP[k]
Λ
SUC 3 8 7 6 8 4 6 5
R ← 0, Λ Λ Λ Λ Λ Λ
NEXT
QLINK[0] ← 0
foreach (1≤k≤n)
5
if COUNT[k] == 0 then QLINK[R] ← k, R ← k 2
F ← QLINK[0] Λ Λ
31. QLINK[0] = 1, R = 9, N = 9
k 1 2 3 4 5 6 7 8 9
COUNT[k] 9 1 1 1 2 2 1 2 0
TOP[k]
Λ
SUC 3 8 7 6 8 4 6 5
R ← 0, Λ Λ Λ Λ Λ Λ
NEXT
QLINK[0] ← 0
foreach (1≤k≤n)
5
if COUNT[k] == 0 then QLINK[R] ← k, R ← k 2
F ← QLINK[0] Λ Λ
32. QLINK[0] = 1, F = 1, R = 9, N = 9
k 1 2 3 4 5 6 7 8 9
COUNT[k] 9 1 1 1 2 2 1 2 0
TOP[k]
Λ
SUC 3 8 7 6 8 4 6 5
R ← 0, Λ Λ Λ Λ Λ Λ
NEXT
QLINK[0] ← 0
foreach (1≤k≤n)
5
if COUNT[k] == 0 then QLINK[R] ← k, R ← k 2
F ← QLINK[0] Λ Λ
33. QLINK[0] = 1, F = 1, R = 9, N = 9
k 1 2 3 4 5 6 7 8 9
COUNT[k] 9 1 1 1 22 1 2 0
TOP[k] COUNT가 0인 것들 중
가장 먼저 나온 숫자가Λ
F에 들어간다.
SUC 3 8 7 6 0인 숫자들은 4
COUNT가 8 6 5
QLINK로 이어져 있음
R ← 0, Λ Λ Λ Λ Λ Λ
NEXT
QLINK[0] ← 0
foreach (1≤k≤n) 1→9
5
if COUNT[k] == 0 then QLINK[R] ← k, R ← k 2
F ← QLINK[0] Λ Λ
34. T1. 초기화
T2. 다음 관계 T3. 관계 기록
T4. 0들을 찾는다 T5. 대기열 앞단 출력 T6. 관계들 삭제
T8. 공정 끝 T7. 대기열에서 제거
F 출력
if F == 0
goto T8
else
N ← N – 1, P ← TOP[F]
35. 출력 : 1 QLINK[0] = 1, F = 1, R = 9, N = 9
k 1 2 3 4 5 6 7 8 9
COUNT[k] 9 1 1 1 2 2 1 2 0
TOP[k]
Λ
SUC 3 8 7 6 8 4 6 5
NEXT Λ Λ Λ Λ Λ Λ
F 출력, if (F == 0) { goto T8 } else { N ← N – 1, P ← TOP[F] }
5 2
Λ Λ
36. 출력 : 1 QLINK[0] = 1, F = 1, R = 9, N = 8
k 1 2 3 4 5 6 7 8 9
COUNT[k] 9 1 1 1 2 2 1 2 0
TOP[k]
Λ
P
SUC 3 8 7 6 8 4 6 5
NEXT Λ Λ Λ Λ Λ Λ
F 출력, if (F == 0) { goto T8 } else { N ← N – 1, P ← TOP[F] }
5 2
Λ Λ
37. 출력 : 1 QLINK[0] = 1, F = 1, R = 9, N = 8
k 1 2 3 4 5 6 7 8 9
COUNT[k] 9 1 1 1 2
2 1 2 0
TOP[k]
Λ
이 단계에서만 출력이 이루어짐
P 출력한 숫자 직접 후행자를
P로 지정하고 계속 진행
SUC 3 8 7 6 8 4 6 5
뒤에 단계에서 다음에
NEXT Λ Λ Λ 숫자를 Λ 넣는다.
출력할
Λ F에 Λ
F 출력, if (F == 0) { goto T8 } else { N ← N – 1, P ← TOP[F] }
5 2
Λ Λ
38. T1. 초기화
T2. 다음 관계 T3. 관계 기록
T4. 0들을 찾는다 T5. 대기열 앞단 출력 T6. 관계들 삭제
T8. 공정 끝 T7. 대기열에서 제거
loop
if P == Λ
goto T7
else
COUNT[SUC(P)] = COUNT[SUC(P)] – 1,
if COUNT[SUC(P)] == 0
QLINK[R] ← SUC(P), R ← SUC(P)
P ← NEXT(P)
39. 출력 : 1 QLINK[0] = 1, F = 1, R = 9, N = 8
k 1 2 3 4 5 6 7 8 9
COUNT[k] 9 1 0 1 2 2 1 2 0
TOP[k]
Λ
P
SUC 3 8 7 6 8 4 6 5
NEXT Λ Λ Λ Λ Λ Λ
loop { if (P == Λ) {goto T7}
else { COUNT[SUC(P)]--, 5 2
Λ Λ
if (COUNT[SUC(P)] == 0) {QLINK[R] ← SUC(P), R ← SUC(P)}
P ← NEXT(P) }
40. 출력 : 1 QLINK[0] = 1, F = 1, R = 3, N = 8
k 1 2 3 4 5 6 7 8 9
COUNT[k] 9 1 0 1 2 2 1 2 3
TOP[k]
Λ
P
SUC 3 8 7 6 8 4 6 5
NEXT Λ Λ Λ Λ Λ Λ
loop { if (P == Λ) {goto T7}
else { COUNT[SUC(P)]--, 5 2
Λ Λ
if (COUNT[SUC(P)] == 0) {QLINK[R] ← SUC(P), R ← SUC(P)}
P ← NEXT(P) }
41. 출력 : 1 QLINK[0] = 1, F = 1, R = 3, N = 8
k 1 2 3 4 5 6 7 8 9
COUNT[k] 9 1 0 1 2 2 1 2 3
TOP[k]
Λ
P
SUC 3 8 7 6 8 4 6 5
NEXT Λ Λ Λ Λ Λ Λ
loop { if (P == Λ) {goto T7}
else { COUNT[SUC(P)]--, 5 2
Λ Λ
if (COUNT[SUC(P)] == 0) {QLINK[R] ← SUC(P), R ← SUC(P)}
P ← NEXT(P) }
42. 출력 : 1 QLINK[0] = 1, F = 1, R = 3, N = 8
k 1 2 3 4 5 6 7 8 9
COUNT[k] 9 1 출력한 숫자의 직접 후행자들 1
0 1 2 2 2 3
COUNT를 감소
TOP[k]
Λ
(COUNT는 직접 선행자 개수)
P
1 ≺ 3, 1 ≺ 5 가 있고
SUC 3 8 71을 출력했다면 3, 5의
6 8 4 6 5
직접 선행자 개수를 줄인다
NEXT Λ Λ Λ Λ Λ Λ
출력한 숫자 뒷정리라 생각하면 됨
loop { if (P == Λ) {goto T7}
else { COUNT[SUC(P)]--, 5 2
Λ Λ
if (COUNT[SUC(P)] == 0) {QLINK[R] ← SUC(P), R ← SUC(P)}
P ← NEXT(P) }
43. T1. 초기화
T2. 다음 관계 T3. 관계 기록
T4. 0들을 찾는다 T5. 대기열 앞단 출력 T6. 관계들 삭제
T8. 공정 끝 T7. 대기열에서 제거
F ← QLINK[F], goto T5
44. 출력 : 1 QLINK[0] = 1, F = 3, R = 3, N = 8
k 1 2 3 4 5 6 7 8 9
COUNT[k] 9 1 0 1 2 2 1 2 3
TOP[k]
Λ
P
SUC 3 8 7 6 8 4 6 5
NEXT Λ Λ Λ Λ Λ Λ
F ← QLINK[F], goto T5
5 2
Λ Λ
45. 출력 : 1 QLINK[0] = 1, F = 3, R = 3, N = 8
k 1 2 3 4 5 6 7 8 9
COUNT[k] 9 1 앞0
단계에서 직접2
1 선행자가 0인1
2 2 3
TOP[k] 숫자를 QLINK로 연결
Λ
P
여기선 QLINK를 따라가며 다음에
출력할 숫자를 F에 넣는다
SUC 3 8 7 6 8 4 6 5
NEXT Λ Λ Λ Λ 따라 가는거니
QLINK는 Λ Λ
헷갈리지 말 것.
F ← QLINK[F], goto T5
5 2
Λ Λ