4. 알고리즘?
입력을 출력으로 변환하는 계산 절차
입출력 예시 (정렬 알고리즘)
입력: n개의 숫자로 구성된 시퀀스 𝑎1, 𝑎2, ⋯ , 𝑎 𝑛
출력: 𝑎1
′ ≤ 𝑎2
′ ≤ ⋯ ≤ 𝑎 𝑛
′ 가 되도록 입력 시퀀스를 재정렬
한
𝑎1
′ , 𝑎2
′ , ⋯ , 𝑎 𝑛
′
4
입력 출력
5. 알고리즘이 사용되는 곳
5
영상 통화
영상/음성 압축 알고리즘
내비게이션
경로 탐색 알고리즘
3D 그래픽스
렌더링 알고리즘
로봇
제어 알고리즘
6. 알고리즘을 표현하는 방법
요구 사항
계산 절차가 정확하게 표현되어야 한다.
표현 방법
6
INSERTION-SORT(A)
for j = 2 to A.length
key = A[j]
i = j – 1
while i > 0 and A[i] > key
A[i+1]=A[i]
i = i – 1
A[i+1] = key
순서도 의사 코드 프로그램 코드
7. 좋은 알고리즘이란?
올바른 알고리즘
모든 입력에 대해 올바른 출력을 얻는다.
(항상 올바른 알고리즘만 사용하는 것은 아님 : 허용 오차 범위)
효율성
계산 시간 (시간 복잡도)
메모리 (공간 복잡도)
7
제시간에 계산하지 못하면?
8. 학교에 바라는 바
8
알고리즘
지식
• 사실상 암기 과목임 (이해를 바탕으로 하는)
• 알고리즘 지식은 대학에 가서 배워도 됨
(올림피아드 나갈 것이 아니라면)
• 일반 수업 : 몰라도 됨
• 동아리 : 한 가지 정도 경험해 보는 수준으로
알고리즘
구현
• 돌아만 가면 된다? 코드 대충 짜지 않기
(잘못된 습관은 나중에 고치기 어려움)
• 결과 나왔다고 땡 하지 않기
• 더 좋은 코드를 작성할 수 있도록 고민하기
• 발표와 질문 많이 하기
지금 단계에서는 지식보다 효율적인 구현 중심으로~
42. 구현
42
15
4
8
3
24
9
20
데이터 개수 : 7
1 2 3 4 5 6 7
1번째: j = 1~6
데이터[j], 데이터[j+1] 비교
2번째: j = 1~5
데이터[j], 데이터[j+1] 비교
3번째: j = 1~4
데이터[j], 데이터[j+1] 비교
4번째: j = 1~3
데이터[j], 데이터[j+1] 비교
5번째: j = 1~2
데이터[j], 데이터[j+1] 비교
6번째: j = 1~1
데이터[j], 데이터[j+1] 비교
i = (데이터 개수 - 1) ~ 1
j = 1 ~ i
43. 구현
43
데이터 셋 만들기
i = (데이터 개수 – 1) ~ 1
j = 1 ~ i
데이터[j] > 데이터[j+1]
데이터[j]와 데이터[j+1] 맞바꾸기
44. 버블 정렬 파이선 코드
44
def bubbleSort(x):
for i in range(len(x)-1, 0, -1):
for j in range(i):
if x[j] > x[j+1]:
x[j], x[j+1] = x[j+1], x[j]
return x
def bubbleSort(x):
length = len(x)-1
for i in range(length):
for j in range(length-i):
if x[j] > x[j+1]:
x[j], x[j+1] = x[j+1], x[j]
return x
또는
45. 버블 정렬 파이선 코드
45
def bubbleSort(x):
for i in range(len(x)-1, 0, -1):
quit = True
for j in range(i):
if x[j] > x[j+1]:
x[j], x[j+1] = x[j+1], x[j]
quit = False
if quit:
break
return x
89. 퀵 정렬 파이선 코드 (첫 번째 방법)
89
def quicksort(x):
if len(x) <= 1:
return x
pivot = x[len(x) // 2]
less = []
more = []
equal = []
for a in x:
if a < pivot:
less.append(a)
elif a > pivot:
more.append(a)
else:
equal.append(a)
return quicksort(less) + equal + quicksort(more)
quicksort가 호출될 때마다 새로 만든다.
90. 퀵 정렬 파이선 코드 (두 번째 방법)
90
def partition(x, start, end):
pivot = x[start]
left = start + 1
right = end
done = False
while not done:
while left <= right and x[left] <= pivot:
left += 1
while left <= right and pivot <= x[right]:
right -= 1
if right < left:
done = True
else:
x[left], x[right] = x[right], x[left]
x[start], x[right] = x[right], x[start]
return right
91. 퀵 정렬 파이선 코드 (두 번째 방법)
91
def quick_sort(x, start, end):
if start < end:
pivot = partition(x, start, end)
quick_sort(x, start, pivot - 1)
quick_sort(x, pivot + 1, end)
return x
리스트를 새로 만들지 않고
x의 인덱스만 달리하여 호출
92. 팀(Tim) 정렬 – Tim Peters
• 1993년 ACM-SIAM 심포지엄에서 Peter McIlroy가
발표한 기술 사용
• 2002년 Tim Peters가 파이선에서 사용하기 위해
구현
• 파이선 버전 2.3부터 표준 정렬 알고리즘으로 사용
• 자바 SE7, 안드로이드 등에서 사용
• 실제 데이터에서 가장 좋은 알고리즘으로 알려져
있음
• 파이선 구현: Tim Peters
• 자바 구현: Josh Bloch
92
93. 팀(Tim) 정렬 – Tim Peters
• 데이터가 정렬된 정도에 따라
삽입 정렬과 병합 정렬 사이를 전환하는
적응형 알고리즘
– 삽입 정렬 Worst O(n2) Best O(n) Average O(n2)
– 병합 정렬 Worst O(nlogn) Best O(nlogn)
Average O(nlogn)
– 팀 정렬 Worst O(nlogn) Best O(n)
Average O(nlogn)
– 퀵 정렬 Worst O(n2) Best O(n) ~ O(nlogn)
Average O(nlogn)
93
118. 구현 : 지도 만들기
118
2 지도 데이터 입력
1 1 1 1 1 1 1 1 1 1
1 0 0 0 0 0 0 0 0 1
1 0 1 1 1 1 0 1 0 1
1 0 0 0 0 1 0 1 0 1
1 1 0 1 0 1 0 0 0 1
1 0 0 1 0 0 0 1 0 1
1 1 1 1 1 1 1 1 1 1
항목 수를 70(지도의 전체 칸 수)으로 하여
데이터 입력
순서대로 입력
119. 구현 : 지도 만들기
119
2 지도 데이터 입력
1 1 1 1 1 1 1 1 1 1
1 0 0 0 0 0 0 0 0 1
1 0 1 1 1 1 0 1 0 1
1 0 0 0 0 1 0 1 0 1
1 1 0 1 0 1 0 0 0 1
1 0 0 1 0 0 0 1 0 1
1 1 1 1 1 1 1 1 1 1
편의를 위해 변수 폭, 높이 추가함
120. 구현 : 지도 만들기
120
2 지도 데이터 입력
1 1 1 1 1 1 1 1 1 1
1 0 0 0 0 0 0 0 0 1
1 0 1 1 1 1 0 1 0 1
1 0 0 0 0 1 0 1 0 1
1 1 0 1 0 1 0 0 0 1
1 0 0 1 0 0 0 1 0 1
1 1 1 1 1 1 1 1 1 1
또는
항목 수는 0으로 하고
코드를 작성하여 데이터 입력
편의를 위해 변수 폭, 높이 추가함
순서대로 입력
리스트를 만들 때 항목 수를 70으로 하여 데이터를 입력하거나
리스트는 항목 수 0으로 만들고 코드에서 데이터 70개를 추가하거나 둘 중 하나만
121. 구현 : 지도 만들기
지도가 제대로
입력되었는지
확인해 봅시다.
121
그림 크기를 작게 줄이세요
적당한 간격으로
적당한 간격으로
적당한 초기 위치로
변수 추가
122. 너비 우선 탐색
122
S 12 13 14 15 16 17 18
22 23 24 25 26 27 28 29
32 33 34 35 36 37 38 39
42 43 44 45 46 47 48 49
53 54 55 56 57 58 59S
G
경로 기록
123. 너비 우선 탐색
123
S
S
12 13 14 15 16 17 18
22 23 24 25 26 27 28 29
32 33 34 35 36 37 38 39
42 43 44 45 46 47 48 49
53 54 55 56 57 58 59S
G
경로 기록