SlideShare a Scribd company logo
1 of 76
우선순위 큐
(Priority Queue)
동명대학교 게임공학과 김광일
rlarhk123@gmail.com
http://blog.naver.com/4roring
큐는 알겠는데
우선순위 큐가 뭐지?
우선순위 큐란?
큐지만 들어간 데이터의 순서와 상관없이
우선순위가 높은 데이터가 먼저 나가는 큐!
우선순위 큐란?
큐지만 들어간 데이터의 순서와 상관없이
우선순위가 높은 데이터가 먼저 나가는 큐!
예를 들어 병원이 있다.
우선순위 큐란?
큐지만 들어간 데이터의 순서와 상관없이
우선순위가 높은 데이터가 먼저 나가는 큐!
예를 들어 병원이 있다.
병원을 이용하기 위해 손님들이 찾아온다.
우선순위 큐란?
큐지만 들어간 데이터의 순서와 상관없이
우선순위가 높은 데이터가 먼저 나가는 큐!
예를 들어 병원이 있다.
병원을 이용하기 위해 손님들이 찾아온다.
우선순위 큐란?
큐지만 들어간 데이터의 순서와 상관없이
우선순위가 높은 데이터가 먼저 나가는 큐!
예를 들어 병원이 있다.
병원을 이용하기 위해 손님들이 찾아온다.
우선순위 큐란?
큐지만 들어간 데이터의 순서와 상관없이
우선순위가 높은 데이터가 먼저 나가는 큐!
예를 들어 병원이 있다.
병원을 이용하기 위해 손님들이 찾아온다.
우선순위 큐란?
큐지만 들어간 데이터의 순서와 상관없이
우선순위가 높은 데이터가 먼저 나가는 큐!
예를 들어 병원이 있다.
병원을 이용하기 위해 손님들이 찾아온다.
우선순위 큐란?
큐지만 들어간 데이터의 순서와 상관없이
우선순위가 높은 데이터가 먼저 나가는 큐!
예를 들어 병원이 있다.
병원을 이용하기 위해 손님들이 찾아온다.
우선순위 큐란?
큐지만 들어간 데이터의 순서와 상관없이
우선순위가 높은 데이터가 먼저 나가는 큐!
예를 들어 병원이 있다.
병원을 이용하기 위해 손님들이 찾아온다.
그리고 하나 둘 병원에 들어가는데.
우선순위 큐란?
큐지만 들어간 데이터의 순서와 상관없이
우선순위가 높은 데이터가 먼저 나가는 큐!
예를 들어 병원이 있다.
병원을 이용하기 위해 손님들이 찾아온다.
그리고 하나 둘 병원에 들어가는데.
우선순위 큐란?
큐지만 들어간 데이터의 순서와 상관없이
우선순위가 높은 데이터가 먼저 나가는 큐!
예를 들어 병원이 있다.
병원을 이용하기 위해 손님들이 찾아온다.
그리고 하나 둘 병원에 들어가는데.
우선순위 큐란?
큐지만 들어간 데이터의 순서와 상관없이
우선순위가 높은 데이터가 먼저 나가는 큐!
예를 들어 병원이 있다.
병원을 이용하기 위해 손님들이 찾아온다.
그리고 하나 둘 병원에 들어가는데.
우선순위 큐란?
큐지만 들어간 데이터의 순서와 상관없이
우선순위가 높은 데이터가 먼저 나가는 큐!
예를 들어 병원이 있다.
병원을 이용하기 위해 손님들이 찾아온다.
그리고 하나 둘 병원에 들어가는데.
우선순위 큐란?
큐지만 들어간 데이터의 순서와 상관없이
우선순위가 높은 데이터가 먼저 나가는 큐!
예를 들어 병원이 있다.
병원을 이용하기 위해 손님들이 찾아온다.
그리고 하나 둘 병원에 들어가는데.
이때 응급환자가 실려온다.
우선순위 큐란?
큐지만 들어간 데이터의 순서와 상관없이
우선순위가 높은 데이터가 먼저 나가는 큐!
예를 들어 병원이 있다.
병원을 이용하기 위해 손님들이 찾아온다.
그리고 하나 둘 병원에 들어가는데.
이때 응급환자가 실려온다.
우선순위 큐란?
큐지만 들어간 데이터의 순서와 상관없이
우선순위가 높은 데이터가 먼저 나가는 큐!
예를 들어 병원이 있다.
병원을 이용하기 위해 손님들이 찾아온다.
그리고 하나 둘 병원에 들어가는데.
이때 응급환자가 실려온다.
환자의 상태는 심각하기 때문에 다른 손님보다 우선순위를 가지고 먼저 들어간다.
우선순위 큐란?
큐지만 들어간 데이터의 순서와 상관없이
우선순위가 높은 데이터가 먼저 나가는 큐!
예를 들어 병원이 있다.
병원을 이용하기 위해 손님들이 찾아온다.
그리고 하나 둘 병원에 들어가는데.
이때 응급환자가 실려온다.
환자의 상태는 심각하기 때문에 다른 손님보다 우선순위를 가지고 먼저 들어간다.
우선순위 큐란?
큐지만 들어간 데이터의 순서와 상관없이
우선순위가 높은 데이터가 먼저 나가는 큐!
예를 들어 병원이 있다.
병원을 이용하기 위해 손님들이 찾아온다.
그리고 하나 둘 병원에 들어가는데.
이때 응급환자가 실려온다.
환자의 상태는 심각하기 때문에 다른 손님보다 우선순위를 가지고 먼저 들어간다.
다시 한 번 설명 한다.
집중해서 보자!
다시 한 번 설명 한다.
집중해서 보자!
우선 큐에 데이터를 채웁니다.
다시 한 번 설명 한다.
집중해서 보자!
우선 큐에 데이터를 채웁니다.
1
다시 한 번 설명 한다.
집중해서 보자!
우선 큐에 데이터를 채웁니다.
1 12
다시 한 번 설명 한다.
집중해서 보자!
우선 큐에 데이터를 채웁니다.
1 12 2
다시 한 번 설명 한다.
집중해서 보자!
우선 큐에 데이터를 채웁니다.
1 12 2 13
다시 한 번 설명 한다.
집중해서 보자!
우선 큐에 데이터를 채웁니다.
1 12 2 13 7
다시 한 번 설명 한다.
집중해서 보자!
우선 큐에 데이터를 채웁니다.
1 12 2 13 7 9
다시 한 번 설명 한다.
집중해서 보자!
우선 큐에 데이터를 채웁니다.
1 12 2 13 7 9 15
다시 한 번 설명 한다.
집중해서 보자!
우선 큐에 데이터를 채웁니다.
1 12 2 13 7 9 15
낮은 숫자가 우선순위가 높다고 가정하고 데이터를 출력합니다.
다시 한 번 설명 한다.
집중해서 보자!
우선 큐에 데이터를 채웁니다.
12 2 13 7 9 15
낮은 숫자가 우선순위가 높다고 가정하고 데이터를 출력합니다.
다시 한 번 설명 한다.
집중해서 보자!
우선 큐에 데이터를 채웁니다.
12 13 7 9 15
낮은 숫자가 우선순위가 높다고 가정하고 데이터를 출력합니다.
다시 한 번 설명 한다.
집중해서 보자!
우선 큐에 데이터를 채웁니다.
12 13 9 15
낮은 숫자가 우선순위가 높다고 가정하고 데이터를 출력합니다.
다시 한 번 설명 한다.
집중해서 보자!
우선 큐에 데이터를 채웁니다.
12 13 9 15
낮은 숫자가 우선순위가 높다고 가정하고 데이터를 출력합니다.
이제 우리는 우선순위 큐가 무엇인지 알게 되었습니다.
이제 우선순위 큐가 뭔지는 알겠다.
그래서 구현은 어떻게 하지?
우선순위 큐의 구현 힙(Heap)
• 우선순위 큐는 배열과 연결리스트를 이용
해서 구현은 가능하다. 하지만 우선순위를
알 수 있는 키(key)값을 찾기 위해서 전체
를 탐색함으로 매우 비효율적이다.
• 그래서 힙을 이용한 구현을 한다.
아니 우선순위 큐를
구현하려 했더니
힙(Heap)이라니
이게 무슨 소리요!!!
힙(Heap) - 1
• 우리는 이진 탐색을 배우면서 이진 트리를 익혔다.
• 하지만 그건 우선 여기서는 패스!!!
• 우리에게 필요한 것은 완전 이진 트리다.
• 뭐? 완전 이진 트리???
힙(Heap) - 1
• 우리는 이진 탐색을 배우면서 이진 트리를 익혔다.
• 하지만 그건 우선 여기서는 패스!!!
• 우리에게 필요한 것은 완전 이진 트리다.
• 뭐? 완전 이진 트리???
5
12 8
16 14 9 11
힙(Heap) - 1
• 우리는 이진 탐색을 배우면서 이진 트리를 익혔다.
• 하지만 그건 우선 여기서는 패스!!!
• 우리에게 필요한 것은 완전 이진 트리다.
• 뭐? 완전 이진 트리???
5
12 8
16 14 9 11
중간에 빈 곳 없이 채워진 트리!!
힙(Heap) - 1
• 우리는 이진 탐색을 배우면서 이진 트리를 익혔다.
• 하지만 그건 우선 여기서는 패스!!!
• 우리에게 필요한 것은 완전 이진 트리다.
• 뭐? 완전 이진 트리???
5
12 8
16 14 9 11
중간에 빈 곳 없이 채워진 트리!!
배열을 이용하여 구현한다!
그리고 배열의 0번은 비워둔다! 그 이유는 뒤에!
힙(Heap) - 1
• 우리는 이진 탐색을 배우면서 이진 트리를 익혔다.
• 하지만 그건 우선 여기서는 패스!!!
• 우리에게 필요한 것은 완전 이진 트리다.
• 뭐? 완전 이진 트리???
5
12 8
16 14 9 11
중간에 빈 곳 없이 채워진 트리!!
배열을 이용하여 구현한다!
그리고 배열의 0번은 비워둔다! 그 이유는 뒤에!
1
2 3
4 5 6 7
5 12 8 16 14 9 11
1 2 3 4 5 6 70
• 2종류의 힙 과 그 속성
• MAX heap
부모 노드의 키 값이 자식 노드의 키 값보다 크거나 같은 완전 이진 트리
• MIN heap
부모 노드의 키 값이 자식 노드의 키 값보다 작거나 같은 완전 이진 트리
힙(Heap) - 2
0
8 12
16 14 21 14
MIN heap
20
9 10
8 7 4 2
MAX heap
• 부모와 자식의 관계
우선 MIN heap으로 구현을 생각하고 설명한다.
노드 i 가 있다. (i를 2라고 생각해보자)
(힙에서는 1번 노드가 배열 1부터 시작!)
힙(Heap) - 3
1
2 3
4 5 6 7
8
• 부모와 자식의 관계
우선 MIN heap으로 구현을 생각하고 설명한다.
노드 i 가 있다. (i를 2라고 생각해보자)
(힙에서는 1번 노드가 배열 1부터 시작!)
힙(Heap) - 3
1
2 3
4 5 6 7
8
i
• 부모와 자식의 관계
우선 MIN heap으로 구현을 생각하고 설명한다.
노드 i 가 있다. (i를 2라고 생각해보자)
(힙에서는 1번 노드가 배열 1부터 시작!)
힙(Heap) - 3
1
2 3
4 5 6 7
8
2의 자식은 4와 5가 있다.
i
• 부모와 자식의 관계
우선 MIN heap으로 구현을 생각하고 설명한다.
노드 i 가 있다. (i를 2라고 생각해보자)
(힙에서는 1번 노드가 배열 1부터 시작!)
힙(Heap) - 3
1
2 3
4 5 6 7
8
2의 자식은 4와 5가 있다.
i
• 부모와 자식의 관계
우선 MIN heap으로 구현을 생각하고 설명한다.
노드 i 가 있다. (i를 2라고 생각해보자)
(힙에서는 1번 노드가 배열 1부터 시작!)
힙(Heap) - 3
1
2 3
4 5 6 7
8
2의 자식은 4와 5가 있다.
왼쪽 자식 4 = i(2)*2
오른쪽 자식 5 = i(2)*2+1
i
• 부모와 자식의 관계
우선 MIN heap으로 구현을 생각하고 설명한다.
노드 i 가 있다. (i를 2라고 생각해보자)
(힙에서는 1번 노드가 배열 1부터 시작!)
힙(Heap) - 3
1
2 3
4 5 6 7
8
2의 자식은 4와 5가 있다.
왼쪽 자식 4 = i(2)*2
오른쪽 자식 5 = i(2)*2+1
i
4 = i(2)*2
• 부모와 자식의 관계
우선 MIN heap으로 구현을 생각하고 설명한다.
노드 i 가 있다. (i를 2라고 생각해보자)
(힙에서는 1번 노드가 배열 1부터 시작!)
힙(Heap) - 3
1
2 3
4 5 6 7
8
2의 자식은 4와 5가 있다.
왼쪽 자식 4 = i(2)*2
오른쪽 자식 5 = i(2)*2+1
i
• 부모와 자식의 관계
우선 MIN heap으로 구현을 생각하고 설명한다.
노드 i 가 있다. (i를 2라고 생각해보자)
(힙에서는 1번 노드가 배열 1부터 시작!)
힙(Heap) - 3
1
2 3
4 5 6 7
8
2의 자식은 4와 5가 있다.
왼쪽 자식 4 = i(2)*2
오른쪽 자식 5 = i(2)*2+1
i
5 = i(2)*2+1
• 부모와 자식의 관계
우선 MIN heap으로 구현을 생각하고 설명한다.
노드 i 가 있다. (i를 2라고 생각해보자)
(힙에서는 1번 노드가 배열 1부터 시작!)
힙(Heap) - 3
1
2 3
4 5 6 7
8
2의 자식은 4와 5가 있다.
왼쪽 자식 4 = i(2)*2
오른쪽 자식 5 = i(2)*2+1
i
• 부모와 자식의 관계
우선 MIN heap으로 구현을 생각하고 설명한다.
노드 i 가 있다. (i를 2라고 생각해보자)
(힙에서는 1번 노드가 배열 1부터 시작!)
힙(Heap) - 3
1
2 3
4 5 6 7
8
2의 자식은 4와 5가 있다.
왼쪽 자식 4 = i(2)*2
오른쪽 자식 5 = i(2)*2+1
i이제 i를 각각 4와 5라 생각해보자
• 부모와 자식의 관계
우선 MIN heap으로 구현을 생각하고 설명한다.
노드 i 가 있다. (i를 2라고 생각해보자)
(힙에서는 1번 노드가 배열 1부터 시작!)
힙(Heap) - 3
1
2 3
4 5 6 7
8
2의 자식은 4와 5가 있다.
왼쪽 자식 4 = i(2)*2
오른쪽 자식 5 = i(2)*2+1
이제 i를 각각 4와 5라 생각해보자
• 부모와 자식의 관계
우선 MIN heap으로 구현을 생각하고 설명한다.
노드 i 가 있다. (i를 2라고 생각해보자)
(힙에서는 1번 노드가 배열 1부터 시작!)
힙(Heap) - 3
1
2 3
4 5 6 7
8
2의 자식은 4와 5가 있다.
왼쪽 자식 4 = i(2)*2
오른쪽 자식 5 = i(2)*2+1
이제 i를 각각 4와 5라 생각해보자
i
• 부모와 자식의 관계
우선 MIN heap으로 구현을 생각하고 설명한다.
노드 i 가 있다. (i를 2라고 생각해보자)
(힙에서는 1번 노드가 배열 1부터 시작!)
힙(Heap) - 3
1
2 3
4 5 6 7
8
2의 자식은 4와 5가 있다.
왼쪽 자식 4 = i(2)*2
오른쪽 자식 5 = i(2)*2+1
이제 i를 각각 4와 5라 생각해보자
i
그리고 각각 자식들의 부모 값 2
i(4)/2 = 2
i(5)/2 = 2 (int로 받아서 나머지 값 무시!)
• 부모와 자식의 관계
우선 MIN heap으로 구현을 생각하고 설명한다.
노드 i 가 있다. (i를 2라고 생각해보자)
(힙에서는 1번 노드가 배열 1부터 시작!)
힙(Heap) - 3
1
2 3
4 5 6 7
8
2의 자식은 4와 5가 있다.
왼쪽 자식 4 = i(2)*2
오른쪽 자식 5 = i(2)*2+1
이제 i를 각각 4와 5라 생각해보자
i
그리고 각각 자식들의 부모 값 2
i(4)/2 = 2
i(5)/2 = 2 (int로 받아서 나머지 값 무시!)
이 계산을 편히 하기 위하여
배열의 0번을 비워두었다!!!
• 삽입 연산
들어온 노드의 키 값을 보고 부모 노드와 비교 후 위치를 바꾼다.
힙(Heap)의 연산 - 1
0
2 3
7 8 5 12
10
1
2 3
4 5 6 7
8
• 삽입 연산
들어온 노드의 키 값을 보고 부모 노드와 비교 후 위치를 바꾼다.
힙(Heap)의 연산 - 1
0
2 3
7 8 5 12
10
1
2 3
4 5 6 7
8
우선 1의 키 값을 가진 노드를 삽입
• 삽입 연산
들어온 노드의 키 값을 보고 부모 노드와 비교 후 위치를 바꾼다.
힙(Heap)의 연산 - 1
0
2 3
7 8 5 12
10
1
2 3
4 5 6 7
8 19
우선 1의 키 값을 가진 노드를 삽입
• 삽입 연산
들어온 노드의 키 값을 보고 부모 노드와 비교 후 위치를 바꾼다.
힙(Heap)의 연산 - 1
0
2 3
7 8 5 12
10
1
2 3
4 5 6 7
8 19
우선 1의 키 값을 가진 노드를 삽입
부모 노드와 키 값을 비교하여 교환
• 삽입 연산
들어온 노드의 키 값을 보고 부모 노드와 비교 후 위치를 바꾼다.
힙(Heap)의 연산 - 1
0
2 3
7
8 5 12
10
1
2 3
4 5 6 7
8
1
9
우선 1의 키 값을 가진 노드를 삽입
부모 노드와 키 값을 비교하여 교환
• 삽입 연산
들어온 노드의 키 값을 보고 부모 노드와 비교 후 위치를 바꾼다.
힙(Heap)의 연산 - 1
0
2
3
7
8 5 12
10
1
2 3
4 5 6 7
8
1
9
우선 1의 키 값을 가진 노드를 삽입
부모 노드와 키 값을 비교하여 교환
• 삭제 연산
가장 큰 키값을 가진 노드를 삭제하고 제일 마지막에 있는 노드를 맨 처음
으로 보낸 후 자식 노드와 비교하여 재정렬한다.
힙(Heap)의 연산 - 2
0
2
3
7
8 5 12
10
1
2 3
4 5 6 7
8
1
9
• 삭제 연산
가장 큰 키값을 가진 노드를 삭제하고 제일 마지막에 있는 노드를 맨 처음
으로 보낸 후 자식 노드와 비교하여 재정렬한다.
힙(Heap)의 연산 - 2
0
2
3
7
8 5 12
10
1
2 3
4 5 6 7
8
1
9
가장 큰 키 값을 가진 1번 노드 제거
• 삭제 연산
가장 큰 키값을 가진 노드를 삭제하고 제일 마지막에 있는 노드를 맨 처음
으로 보낸 후 자식 노드와 비교하여 재정렬한다.
힙(Heap)의 연산 - 2
2
3
7
8 5 12
10
1
2 3
4 5 6 7
8
1
9
가장 큰 키 값을 가진 1번 노드 제거
• 삭제 연산
가장 큰 키값을 가진 노드를 삭제하고 제일 마지막에 있는 노드를 맨 처음
으로 보낸 후 자식 노드와 비교하여 재정렬한다.
힙(Heap)의 연산 - 2
2
3
7
8 5 12
10
1
2 3
4 5 6 7
8
1
9
가장 큰 키 값을 가진 1번 노드 제거
제일 마지막 노드를 1번 노드로 이동
• 삭제 연산
가장 큰 키값을 가진 노드를 삭제하고 제일 마지막에 있는 노드를 맨 처음
으로 보낸 후 자식 노드와 비교하여 재정렬한다.
힙(Heap)의 연산 - 2
2
3
7
8 5 12
10
1
2 3
4 5 6 7
8
1
9
가장 큰 키 값을 가진 1번 노드 제거
제일 마지막 노드를 1번 노드로 이동
• 삭제 연산
가장 큰 키값을 가진 노드를 삭제하고 제일 마지막에 있는 노드를 맨 처음
으로 보낸 후 자식 노드와 비교하여 재정렬한다.
힙(Heap)의 연산 - 2
2
3
7
8 5 12
10
1
2 3
4 5 6 7
8
1
가장 큰 키 값을 가진 1번 노드 제거
제일 마지막 노드를 1번 노드로 이동
• 삭제 연산
가장 큰 키값을 가진 노드를 삭제하고 제일 마지막에 있는 노드를 맨 처음
으로 보낸 후 자식 노드와 비교하여 재정렬한다.
힙(Heap)의 연산 - 2
2
3
7
8 5 12
10
1
2 3
4 5 6 7
8
1
가장 큰 키 값을 가진 1번 노드 제거
제일 마지막 노드를 1번 노드로 이동
자식 노드와 키 값을 비교하여 교환
• 삭제 연산
가장 큰 키값을 가진 노드를 삭제하고 제일 마지막에 있는 노드를 맨 처음
으로 보낸 후 자식 노드와 비교하여 재정렬한다.
힙(Heap)의 연산 - 2
2
37
8 5 12
10
1
2 3
4 5 6 7
8
1
가장 큰 키 값을 가진 1번 노드 제거
제일 마지막 노드를 1번 노드로 이동
자식 노드와 키 값을 비교하여 교환
• 삭제 연산
가장 큰 키값을 가진 노드를 삭제하고 제일 마지막에 있는 노드를 맨 처음
으로 보낸 후 자식 노드와 비교하여 재정렬한다.
힙(Heap)의 연산 - 2
2 3
7 8 5 12
10
1
2 3
4 5 6 7
8
1
가장 큰 키 값을 가진 1번 노드 제거
제일 마지막 노드를 1번 노드로 이동
자식 노드와 키 값을 비교하여 교환
이제 우선순위 큐에 필요한 정보를 모두 알았으니
이제 구현을 해봅시다!
Go
Go
구현을 위한 설계
• C++를 이용한 구현.
PriorityQueue Class를 만들자.
• 노드 배열의 위치를 기억하기 위한 n을 사용하자
int n =1; 배열의 시작은 1이기 때문에 n은 1부터 시작!
• 배열을 이용하는데 data와 key값이 필요하니 구조체 배열을 이용하자!
struct Node{
string data;
int key;
}; 그리고 구조체 배열을 정적으로 100개 할당하고 시작! Node heap[100]
• 데이터를 삽입하기 위한 Push()와 Pop()을 그리고 출력을 위한 Show() !
void Push() void Pop() void Show()
• Push에는 data와 key값을 받을 수 있게 하자!
void Push(string data, int key)
• 노드 비교 후 교환을 위한 Swap을 노드를 참조하여 교환 하자
Swap(Node &a, Node &b);
End

More Related Content

More from KWANGIL KIM

191019 Forward / Deferred Rendering
191019 Forward / Deferred Rendering191019 Forward / Deferred Rendering
191019 Forward / Deferred RenderingKWANGIL KIM
 
190720 언리얼 서밋 2일차 리뷰
190720 언리얼 서밋 2일차 리뷰190720 언리얼 서밋 2일차 리뷰
190720 언리얼 서밋 2일차 리뷰KWANGIL KIM
 
190406 신입 클라이언트 프로그래머 1개월차까지 이야기
190406 신입 클라이언트 프로그래머 1개월차까지 이야기190406 신입 클라이언트 프로그래머 1개월차까지 이야기
190406 신입 클라이언트 프로그래머 1개월차까지 이야기KWANGIL KIM
 
190119 unreal engine c++ 입문 및 팁
190119 unreal engine c++ 입문 및 팁190119 unreal engine c++ 입문 및 팁
190119 unreal engine c++ 입문 및 팁KWANGIL KIM
 
181215 MS SQL로 알아보는 데이터베이스
181215 MS SQL로 알아보는 데이터베이스181215 MS SQL로 알아보는 데이터베이스
181215 MS SQL로 알아보는 데이터베이스KWANGIL KIM
 
포트폴리오에서 사용한 모던 C++
포트폴리오에서 사용한 모던 C++포트폴리오에서 사용한 모던 C++
포트폴리오에서 사용한 모던 C++KWANGIL KIM
 

More from KWANGIL KIM (6)

191019 Forward / Deferred Rendering
191019 Forward / Deferred Rendering191019 Forward / Deferred Rendering
191019 Forward / Deferred Rendering
 
190720 언리얼 서밋 2일차 리뷰
190720 언리얼 서밋 2일차 리뷰190720 언리얼 서밋 2일차 리뷰
190720 언리얼 서밋 2일차 리뷰
 
190406 신입 클라이언트 프로그래머 1개월차까지 이야기
190406 신입 클라이언트 프로그래머 1개월차까지 이야기190406 신입 클라이언트 프로그래머 1개월차까지 이야기
190406 신입 클라이언트 프로그래머 1개월차까지 이야기
 
190119 unreal engine c++ 입문 및 팁
190119 unreal engine c++ 입문 및 팁190119 unreal engine c++ 입문 및 팁
190119 unreal engine c++ 입문 및 팁
 
181215 MS SQL로 알아보는 데이터베이스
181215 MS SQL로 알아보는 데이터베이스181215 MS SQL로 알아보는 데이터베이스
181215 MS SQL로 알아보는 데이터베이스
 
포트폴리오에서 사용한 모던 C++
포트폴리오에서 사용한 모던 C++포트폴리오에서 사용한 모던 C++
포트폴리오에서 사용한 모던 C++
 

OnePointLesson PriorityQueue 우선순위 큐

  • 1. 우선순위 큐 (Priority Queue) 동명대학교 게임공학과 김광일 rlarhk123@gmail.com http://blog.naver.com/4roring
  • 3. 우선순위 큐란? 큐지만 들어간 데이터의 순서와 상관없이 우선순위가 높은 데이터가 먼저 나가는 큐!
  • 4. 우선순위 큐란? 큐지만 들어간 데이터의 순서와 상관없이 우선순위가 높은 데이터가 먼저 나가는 큐! 예를 들어 병원이 있다.
  • 5. 우선순위 큐란? 큐지만 들어간 데이터의 순서와 상관없이 우선순위가 높은 데이터가 먼저 나가는 큐! 예를 들어 병원이 있다. 병원을 이용하기 위해 손님들이 찾아온다.
  • 6. 우선순위 큐란? 큐지만 들어간 데이터의 순서와 상관없이 우선순위가 높은 데이터가 먼저 나가는 큐! 예를 들어 병원이 있다. 병원을 이용하기 위해 손님들이 찾아온다.
  • 7. 우선순위 큐란? 큐지만 들어간 데이터의 순서와 상관없이 우선순위가 높은 데이터가 먼저 나가는 큐! 예를 들어 병원이 있다. 병원을 이용하기 위해 손님들이 찾아온다.
  • 8. 우선순위 큐란? 큐지만 들어간 데이터의 순서와 상관없이 우선순위가 높은 데이터가 먼저 나가는 큐! 예를 들어 병원이 있다. 병원을 이용하기 위해 손님들이 찾아온다.
  • 9. 우선순위 큐란? 큐지만 들어간 데이터의 순서와 상관없이 우선순위가 높은 데이터가 먼저 나가는 큐! 예를 들어 병원이 있다. 병원을 이용하기 위해 손님들이 찾아온다.
  • 10. 우선순위 큐란? 큐지만 들어간 데이터의 순서와 상관없이 우선순위가 높은 데이터가 먼저 나가는 큐! 예를 들어 병원이 있다. 병원을 이용하기 위해 손님들이 찾아온다.
  • 11. 우선순위 큐란? 큐지만 들어간 데이터의 순서와 상관없이 우선순위가 높은 데이터가 먼저 나가는 큐! 예를 들어 병원이 있다. 병원을 이용하기 위해 손님들이 찾아온다. 그리고 하나 둘 병원에 들어가는데.
  • 12. 우선순위 큐란? 큐지만 들어간 데이터의 순서와 상관없이 우선순위가 높은 데이터가 먼저 나가는 큐! 예를 들어 병원이 있다. 병원을 이용하기 위해 손님들이 찾아온다. 그리고 하나 둘 병원에 들어가는데.
  • 13. 우선순위 큐란? 큐지만 들어간 데이터의 순서와 상관없이 우선순위가 높은 데이터가 먼저 나가는 큐! 예를 들어 병원이 있다. 병원을 이용하기 위해 손님들이 찾아온다. 그리고 하나 둘 병원에 들어가는데.
  • 14. 우선순위 큐란? 큐지만 들어간 데이터의 순서와 상관없이 우선순위가 높은 데이터가 먼저 나가는 큐! 예를 들어 병원이 있다. 병원을 이용하기 위해 손님들이 찾아온다. 그리고 하나 둘 병원에 들어가는데.
  • 15. 우선순위 큐란? 큐지만 들어간 데이터의 순서와 상관없이 우선순위가 높은 데이터가 먼저 나가는 큐! 예를 들어 병원이 있다. 병원을 이용하기 위해 손님들이 찾아온다. 그리고 하나 둘 병원에 들어가는데.
  • 16. 우선순위 큐란? 큐지만 들어간 데이터의 순서와 상관없이 우선순위가 높은 데이터가 먼저 나가는 큐! 예를 들어 병원이 있다. 병원을 이용하기 위해 손님들이 찾아온다. 그리고 하나 둘 병원에 들어가는데. 이때 응급환자가 실려온다.
  • 17. 우선순위 큐란? 큐지만 들어간 데이터의 순서와 상관없이 우선순위가 높은 데이터가 먼저 나가는 큐! 예를 들어 병원이 있다. 병원을 이용하기 위해 손님들이 찾아온다. 그리고 하나 둘 병원에 들어가는데. 이때 응급환자가 실려온다.
  • 18. 우선순위 큐란? 큐지만 들어간 데이터의 순서와 상관없이 우선순위가 높은 데이터가 먼저 나가는 큐! 예를 들어 병원이 있다. 병원을 이용하기 위해 손님들이 찾아온다. 그리고 하나 둘 병원에 들어가는데. 이때 응급환자가 실려온다. 환자의 상태는 심각하기 때문에 다른 손님보다 우선순위를 가지고 먼저 들어간다.
  • 19. 우선순위 큐란? 큐지만 들어간 데이터의 순서와 상관없이 우선순위가 높은 데이터가 먼저 나가는 큐! 예를 들어 병원이 있다. 병원을 이용하기 위해 손님들이 찾아온다. 그리고 하나 둘 병원에 들어가는데. 이때 응급환자가 실려온다. 환자의 상태는 심각하기 때문에 다른 손님보다 우선순위를 가지고 먼저 들어간다.
  • 20. 우선순위 큐란? 큐지만 들어간 데이터의 순서와 상관없이 우선순위가 높은 데이터가 먼저 나가는 큐! 예를 들어 병원이 있다. 병원을 이용하기 위해 손님들이 찾아온다. 그리고 하나 둘 병원에 들어가는데. 이때 응급환자가 실려온다. 환자의 상태는 심각하기 때문에 다른 손님보다 우선순위를 가지고 먼저 들어간다.
  • 21.
  • 22. 다시 한 번 설명 한다. 집중해서 보자!
  • 23. 다시 한 번 설명 한다. 집중해서 보자! 우선 큐에 데이터를 채웁니다.
  • 24. 다시 한 번 설명 한다. 집중해서 보자! 우선 큐에 데이터를 채웁니다. 1
  • 25. 다시 한 번 설명 한다. 집중해서 보자! 우선 큐에 데이터를 채웁니다. 1 12
  • 26. 다시 한 번 설명 한다. 집중해서 보자! 우선 큐에 데이터를 채웁니다. 1 12 2
  • 27. 다시 한 번 설명 한다. 집중해서 보자! 우선 큐에 데이터를 채웁니다. 1 12 2 13
  • 28. 다시 한 번 설명 한다. 집중해서 보자! 우선 큐에 데이터를 채웁니다. 1 12 2 13 7
  • 29. 다시 한 번 설명 한다. 집중해서 보자! 우선 큐에 데이터를 채웁니다. 1 12 2 13 7 9
  • 30. 다시 한 번 설명 한다. 집중해서 보자! 우선 큐에 데이터를 채웁니다. 1 12 2 13 7 9 15
  • 31. 다시 한 번 설명 한다. 집중해서 보자! 우선 큐에 데이터를 채웁니다. 1 12 2 13 7 9 15 낮은 숫자가 우선순위가 높다고 가정하고 데이터를 출력합니다.
  • 32. 다시 한 번 설명 한다. 집중해서 보자! 우선 큐에 데이터를 채웁니다. 12 2 13 7 9 15 낮은 숫자가 우선순위가 높다고 가정하고 데이터를 출력합니다.
  • 33. 다시 한 번 설명 한다. 집중해서 보자! 우선 큐에 데이터를 채웁니다. 12 13 7 9 15 낮은 숫자가 우선순위가 높다고 가정하고 데이터를 출력합니다.
  • 34. 다시 한 번 설명 한다. 집중해서 보자! 우선 큐에 데이터를 채웁니다. 12 13 9 15 낮은 숫자가 우선순위가 높다고 가정하고 데이터를 출력합니다.
  • 35. 다시 한 번 설명 한다. 집중해서 보자! 우선 큐에 데이터를 채웁니다. 12 13 9 15 낮은 숫자가 우선순위가 높다고 가정하고 데이터를 출력합니다. 이제 우리는 우선순위 큐가 무엇인지 알게 되었습니다.
  • 36. 이제 우선순위 큐가 뭔지는 알겠다. 그래서 구현은 어떻게 하지?
  • 37. 우선순위 큐의 구현 힙(Heap) • 우선순위 큐는 배열과 연결리스트를 이용 해서 구현은 가능하다. 하지만 우선순위를 알 수 있는 키(key)값을 찾기 위해서 전체 를 탐색함으로 매우 비효율적이다. • 그래서 힙을 이용한 구현을 한다.
  • 38. 아니 우선순위 큐를 구현하려 했더니 힙(Heap)이라니 이게 무슨 소리요!!!
  • 39. 힙(Heap) - 1 • 우리는 이진 탐색을 배우면서 이진 트리를 익혔다. • 하지만 그건 우선 여기서는 패스!!! • 우리에게 필요한 것은 완전 이진 트리다. • 뭐? 완전 이진 트리???
  • 40. 힙(Heap) - 1 • 우리는 이진 탐색을 배우면서 이진 트리를 익혔다. • 하지만 그건 우선 여기서는 패스!!! • 우리에게 필요한 것은 완전 이진 트리다. • 뭐? 완전 이진 트리??? 5 12 8 16 14 9 11
  • 41. 힙(Heap) - 1 • 우리는 이진 탐색을 배우면서 이진 트리를 익혔다. • 하지만 그건 우선 여기서는 패스!!! • 우리에게 필요한 것은 완전 이진 트리다. • 뭐? 완전 이진 트리??? 5 12 8 16 14 9 11 중간에 빈 곳 없이 채워진 트리!!
  • 42. 힙(Heap) - 1 • 우리는 이진 탐색을 배우면서 이진 트리를 익혔다. • 하지만 그건 우선 여기서는 패스!!! • 우리에게 필요한 것은 완전 이진 트리다. • 뭐? 완전 이진 트리??? 5 12 8 16 14 9 11 중간에 빈 곳 없이 채워진 트리!! 배열을 이용하여 구현한다! 그리고 배열의 0번은 비워둔다! 그 이유는 뒤에!
  • 43. 힙(Heap) - 1 • 우리는 이진 탐색을 배우면서 이진 트리를 익혔다. • 하지만 그건 우선 여기서는 패스!!! • 우리에게 필요한 것은 완전 이진 트리다. • 뭐? 완전 이진 트리??? 5 12 8 16 14 9 11 중간에 빈 곳 없이 채워진 트리!! 배열을 이용하여 구현한다! 그리고 배열의 0번은 비워둔다! 그 이유는 뒤에! 1 2 3 4 5 6 7 5 12 8 16 14 9 11 1 2 3 4 5 6 70
  • 44. • 2종류의 힙 과 그 속성 • MAX heap 부모 노드의 키 값이 자식 노드의 키 값보다 크거나 같은 완전 이진 트리 • MIN heap 부모 노드의 키 값이 자식 노드의 키 값보다 작거나 같은 완전 이진 트리 힙(Heap) - 2 0 8 12 16 14 21 14 MIN heap 20 9 10 8 7 4 2 MAX heap
  • 45. • 부모와 자식의 관계 우선 MIN heap으로 구현을 생각하고 설명한다. 노드 i 가 있다. (i를 2라고 생각해보자) (힙에서는 1번 노드가 배열 1부터 시작!) 힙(Heap) - 3 1 2 3 4 5 6 7 8
  • 46. • 부모와 자식의 관계 우선 MIN heap으로 구현을 생각하고 설명한다. 노드 i 가 있다. (i를 2라고 생각해보자) (힙에서는 1번 노드가 배열 1부터 시작!) 힙(Heap) - 3 1 2 3 4 5 6 7 8 i
  • 47. • 부모와 자식의 관계 우선 MIN heap으로 구현을 생각하고 설명한다. 노드 i 가 있다. (i를 2라고 생각해보자) (힙에서는 1번 노드가 배열 1부터 시작!) 힙(Heap) - 3 1 2 3 4 5 6 7 8 2의 자식은 4와 5가 있다. i
  • 48. • 부모와 자식의 관계 우선 MIN heap으로 구현을 생각하고 설명한다. 노드 i 가 있다. (i를 2라고 생각해보자) (힙에서는 1번 노드가 배열 1부터 시작!) 힙(Heap) - 3 1 2 3 4 5 6 7 8 2의 자식은 4와 5가 있다. i
  • 49. • 부모와 자식의 관계 우선 MIN heap으로 구현을 생각하고 설명한다. 노드 i 가 있다. (i를 2라고 생각해보자) (힙에서는 1번 노드가 배열 1부터 시작!) 힙(Heap) - 3 1 2 3 4 5 6 7 8 2의 자식은 4와 5가 있다. 왼쪽 자식 4 = i(2)*2 오른쪽 자식 5 = i(2)*2+1 i
  • 50. • 부모와 자식의 관계 우선 MIN heap으로 구현을 생각하고 설명한다. 노드 i 가 있다. (i를 2라고 생각해보자) (힙에서는 1번 노드가 배열 1부터 시작!) 힙(Heap) - 3 1 2 3 4 5 6 7 8 2의 자식은 4와 5가 있다. 왼쪽 자식 4 = i(2)*2 오른쪽 자식 5 = i(2)*2+1 i 4 = i(2)*2
  • 51. • 부모와 자식의 관계 우선 MIN heap으로 구현을 생각하고 설명한다. 노드 i 가 있다. (i를 2라고 생각해보자) (힙에서는 1번 노드가 배열 1부터 시작!) 힙(Heap) - 3 1 2 3 4 5 6 7 8 2의 자식은 4와 5가 있다. 왼쪽 자식 4 = i(2)*2 오른쪽 자식 5 = i(2)*2+1 i
  • 52. • 부모와 자식의 관계 우선 MIN heap으로 구현을 생각하고 설명한다. 노드 i 가 있다. (i를 2라고 생각해보자) (힙에서는 1번 노드가 배열 1부터 시작!) 힙(Heap) - 3 1 2 3 4 5 6 7 8 2의 자식은 4와 5가 있다. 왼쪽 자식 4 = i(2)*2 오른쪽 자식 5 = i(2)*2+1 i 5 = i(2)*2+1
  • 53. • 부모와 자식의 관계 우선 MIN heap으로 구현을 생각하고 설명한다. 노드 i 가 있다. (i를 2라고 생각해보자) (힙에서는 1번 노드가 배열 1부터 시작!) 힙(Heap) - 3 1 2 3 4 5 6 7 8 2의 자식은 4와 5가 있다. 왼쪽 자식 4 = i(2)*2 오른쪽 자식 5 = i(2)*2+1 i
  • 54. • 부모와 자식의 관계 우선 MIN heap으로 구현을 생각하고 설명한다. 노드 i 가 있다. (i를 2라고 생각해보자) (힙에서는 1번 노드가 배열 1부터 시작!) 힙(Heap) - 3 1 2 3 4 5 6 7 8 2의 자식은 4와 5가 있다. 왼쪽 자식 4 = i(2)*2 오른쪽 자식 5 = i(2)*2+1 i이제 i를 각각 4와 5라 생각해보자
  • 55. • 부모와 자식의 관계 우선 MIN heap으로 구현을 생각하고 설명한다. 노드 i 가 있다. (i를 2라고 생각해보자) (힙에서는 1번 노드가 배열 1부터 시작!) 힙(Heap) - 3 1 2 3 4 5 6 7 8 2의 자식은 4와 5가 있다. 왼쪽 자식 4 = i(2)*2 오른쪽 자식 5 = i(2)*2+1 이제 i를 각각 4와 5라 생각해보자
  • 56. • 부모와 자식의 관계 우선 MIN heap으로 구현을 생각하고 설명한다. 노드 i 가 있다. (i를 2라고 생각해보자) (힙에서는 1번 노드가 배열 1부터 시작!) 힙(Heap) - 3 1 2 3 4 5 6 7 8 2의 자식은 4와 5가 있다. 왼쪽 자식 4 = i(2)*2 오른쪽 자식 5 = i(2)*2+1 이제 i를 각각 4와 5라 생각해보자 i
  • 57. • 부모와 자식의 관계 우선 MIN heap으로 구현을 생각하고 설명한다. 노드 i 가 있다. (i를 2라고 생각해보자) (힙에서는 1번 노드가 배열 1부터 시작!) 힙(Heap) - 3 1 2 3 4 5 6 7 8 2의 자식은 4와 5가 있다. 왼쪽 자식 4 = i(2)*2 오른쪽 자식 5 = i(2)*2+1 이제 i를 각각 4와 5라 생각해보자 i 그리고 각각 자식들의 부모 값 2 i(4)/2 = 2 i(5)/2 = 2 (int로 받아서 나머지 값 무시!)
  • 58. • 부모와 자식의 관계 우선 MIN heap으로 구현을 생각하고 설명한다. 노드 i 가 있다. (i를 2라고 생각해보자) (힙에서는 1번 노드가 배열 1부터 시작!) 힙(Heap) - 3 1 2 3 4 5 6 7 8 2의 자식은 4와 5가 있다. 왼쪽 자식 4 = i(2)*2 오른쪽 자식 5 = i(2)*2+1 이제 i를 각각 4와 5라 생각해보자 i 그리고 각각 자식들의 부모 값 2 i(4)/2 = 2 i(5)/2 = 2 (int로 받아서 나머지 값 무시!) 이 계산을 편히 하기 위하여 배열의 0번을 비워두었다!!!
  • 59. • 삽입 연산 들어온 노드의 키 값을 보고 부모 노드와 비교 후 위치를 바꾼다. 힙(Heap)의 연산 - 1 0 2 3 7 8 5 12 10 1 2 3 4 5 6 7 8
  • 60. • 삽입 연산 들어온 노드의 키 값을 보고 부모 노드와 비교 후 위치를 바꾼다. 힙(Heap)의 연산 - 1 0 2 3 7 8 5 12 10 1 2 3 4 5 6 7 8 우선 1의 키 값을 가진 노드를 삽입
  • 61. • 삽입 연산 들어온 노드의 키 값을 보고 부모 노드와 비교 후 위치를 바꾼다. 힙(Heap)의 연산 - 1 0 2 3 7 8 5 12 10 1 2 3 4 5 6 7 8 19 우선 1의 키 값을 가진 노드를 삽입
  • 62. • 삽입 연산 들어온 노드의 키 값을 보고 부모 노드와 비교 후 위치를 바꾼다. 힙(Heap)의 연산 - 1 0 2 3 7 8 5 12 10 1 2 3 4 5 6 7 8 19 우선 1의 키 값을 가진 노드를 삽입 부모 노드와 키 값을 비교하여 교환
  • 63. • 삽입 연산 들어온 노드의 키 값을 보고 부모 노드와 비교 후 위치를 바꾼다. 힙(Heap)의 연산 - 1 0 2 3 7 8 5 12 10 1 2 3 4 5 6 7 8 1 9 우선 1의 키 값을 가진 노드를 삽입 부모 노드와 키 값을 비교하여 교환
  • 64. • 삽입 연산 들어온 노드의 키 값을 보고 부모 노드와 비교 후 위치를 바꾼다. 힙(Heap)의 연산 - 1 0 2 3 7 8 5 12 10 1 2 3 4 5 6 7 8 1 9 우선 1의 키 값을 가진 노드를 삽입 부모 노드와 키 값을 비교하여 교환
  • 65. • 삭제 연산 가장 큰 키값을 가진 노드를 삭제하고 제일 마지막에 있는 노드를 맨 처음 으로 보낸 후 자식 노드와 비교하여 재정렬한다. 힙(Heap)의 연산 - 2 0 2 3 7 8 5 12 10 1 2 3 4 5 6 7 8 1 9
  • 66. • 삭제 연산 가장 큰 키값을 가진 노드를 삭제하고 제일 마지막에 있는 노드를 맨 처음 으로 보낸 후 자식 노드와 비교하여 재정렬한다. 힙(Heap)의 연산 - 2 0 2 3 7 8 5 12 10 1 2 3 4 5 6 7 8 1 9 가장 큰 키 값을 가진 1번 노드 제거
  • 67. • 삭제 연산 가장 큰 키값을 가진 노드를 삭제하고 제일 마지막에 있는 노드를 맨 처음 으로 보낸 후 자식 노드와 비교하여 재정렬한다. 힙(Heap)의 연산 - 2 2 3 7 8 5 12 10 1 2 3 4 5 6 7 8 1 9 가장 큰 키 값을 가진 1번 노드 제거
  • 68. • 삭제 연산 가장 큰 키값을 가진 노드를 삭제하고 제일 마지막에 있는 노드를 맨 처음 으로 보낸 후 자식 노드와 비교하여 재정렬한다. 힙(Heap)의 연산 - 2 2 3 7 8 5 12 10 1 2 3 4 5 6 7 8 1 9 가장 큰 키 값을 가진 1번 노드 제거 제일 마지막 노드를 1번 노드로 이동
  • 69. • 삭제 연산 가장 큰 키값을 가진 노드를 삭제하고 제일 마지막에 있는 노드를 맨 처음 으로 보낸 후 자식 노드와 비교하여 재정렬한다. 힙(Heap)의 연산 - 2 2 3 7 8 5 12 10 1 2 3 4 5 6 7 8 1 9 가장 큰 키 값을 가진 1번 노드 제거 제일 마지막 노드를 1번 노드로 이동
  • 70. • 삭제 연산 가장 큰 키값을 가진 노드를 삭제하고 제일 마지막에 있는 노드를 맨 처음 으로 보낸 후 자식 노드와 비교하여 재정렬한다. 힙(Heap)의 연산 - 2 2 3 7 8 5 12 10 1 2 3 4 5 6 7 8 1 가장 큰 키 값을 가진 1번 노드 제거 제일 마지막 노드를 1번 노드로 이동
  • 71. • 삭제 연산 가장 큰 키값을 가진 노드를 삭제하고 제일 마지막에 있는 노드를 맨 처음 으로 보낸 후 자식 노드와 비교하여 재정렬한다. 힙(Heap)의 연산 - 2 2 3 7 8 5 12 10 1 2 3 4 5 6 7 8 1 가장 큰 키 값을 가진 1번 노드 제거 제일 마지막 노드를 1번 노드로 이동 자식 노드와 키 값을 비교하여 교환
  • 72. • 삭제 연산 가장 큰 키값을 가진 노드를 삭제하고 제일 마지막에 있는 노드를 맨 처음 으로 보낸 후 자식 노드와 비교하여 재정렬한다. 힙(Heap)의 연산 - 2 2 37 8 5 12 10 1 2 3 4 5 6 7 8 1 가장 큰 키 값을 가진 1번 노드 제거 제일 마지막 노드를 1번 노드로 이동 자식 노드와 키 값을 비교하여 교환
  • 73. • 삭제 연산 가장 큰 키값을 가진 노드를 삭제하고 제일 마지막에 있는 노드를 맨 처음 으로 보낸 후 자식 노드와 비교하여 재정렬한다. 힙(Heap)의 연산 - 2 2 3 7 8 5 12 10 1 2 3 4 5 6 7 8 1 가장 큰 키 값을 가진 1번 노드 제거 제일 마지막 노드를 1번 노드로 이동 자식 노드와 키 값을 비교하여 교환
  • 74. 이제 우선순위 큐에 필요한 정보를 모두 알았으니 이제 구현을 해봅시다! Go Go
  • 75. 구현을 위한 설계 • C++를 이용한 구현. PriorityQueue Class를 만들자. • 노드 배열의 위치를 기억하기 위한 n을 사용하자 int n =1; 배열의 시작은 1이기 때문에 n은 1부터 시작! • 배열을 이용하는데 data와 key값이 필요하니 구조체 배열을 이용하자! struct Node{ string data; int key; }; 그리고 구조체 배열을 정적으로 100개 할당하고 시작! Node heap[100] • 데이터를 삽입하기 위한 Push()와 Pop()을 그리고 출력을 위한 Show() ! void Push() void Pop() void Show() • Push에는 data와 key값을 받을 수 있게 하자! void Push(string data, int key) • 노드 비교 후 교환을 위한 Swap을 노드를 참조하여 교환 하자 Swap(Node &a, Node &b);
  • 76. End