다익스트라 알고리즘


1) 탐욕 알고리즘의 활용

2) 최단거리를 구하는 알고리즘

3) 음의 가중치(비용 음수)가 없을때 사용가능





다익스트라 알고리즘 순서


1) 출발점부터 체크 시작

2) '체크하는 노드'와 '연결된 노드'의 비용 업데이트

3) 다음 노드는 '체크하지 않은 노드' 중 '누적 비용'이 제일 낮은 노드를 선택

4) 모든 노드를 다 체크할때까지 반복




다익스트라 알고리즘 그림으로 보기

















다익스트라 알고리즘 코드 보기





'알고리즘 > 최적해 알고리즘' 카테고리의 다른 글

탐욕 알고리즘(Greedy Algorithm)  (0) 2017.02.16




탐욕 알고리즘(혹은 그리디 알고리즘)은 최적해를 구하는 방법 중 하나다.


매 순간마다 가장 최적인 것을 선택하는 방식으로, 최적해를 찾는다.





  • 가장 적은 동전으로 환전하기


탐욕 알고리즘은 가장 큰 동전부터 하나씩 환전하며


최적해를 찾는다.



       



이렇게 동전이 2개가 있을때, 1000원을 환전하면


500원 : 2개

100원 : 0개


총 2개의 동전으로 환전 가능하다.




  • 탐욕 알고리즘의 문제


              



여기에 600원 동전을 추가해보자


위와 같이 1000원을 환전해보면


600원 : 1개

500원 : 0개

100원 : 4개


총 5개의 동전으로 환전 가능하다.


이렇게 탐욕 알고리즘은 항상 최적의 결과를 보장하지 않는다.














하노이탑은 첫번째 기둥에 있는 원판들을

몇가지 규칙을 지키며 마지막 기둥으로 옮겨야 한다.


규칙

한번에 한 원판만 이동 가능

자식보다 작은 원판 위로는 이동 불가능(위 < 아래)

상단에 원판이 있으면 이동 불가능











피보나치 수열은 앞의 두 수를

더하며 나아가는 수열이다.


f(n)을 n번째 피보나치 수라고 한다면

f(n) = f(n-2) + f(n-1)

라는 식으로 표현가능하다.

※단, 피보나치 수열을 계산 하기 위해선, f(1) & f(2) (첫번째 & 두번째)는 주어져야 한다.


f(1) = 0

f(2) = 1

일때, 피보나치 수열은

 

0, 1, 1, 2, 3, 5, 8, 13, 21, 34, 55, 84....

이 된다.





피보나치 수열의 대표적인 문제는 계단 문제다.


문제

계단을 한번에 1개 or 2개를 올라갈 수 있다.

n개의 계단을 올라 갈 수 있는 방법의 수는 몇 개인가?





해설

계단을 올라가는 방법은


계단을 마지막에 계단을 1개 올라가는 방법(주황색 선) 

계단을 마지막에 계단을 2개 올라가는 방법(파란색 선)

이 두 방식의 합이다.


f(n)방식으로 표현하면 아래와 같다.

f(n-1) : 마지막에 1개 올라가는 방법

f(n-2) : 마지막에 2개 올라가는 방법


즉, 

f(n) = f(n - 1) + f(n - 2)

(계단 n개를 올라가는 방법 = 마지막에 1개 올라가는 방법 + 마지막에 2 올라가는 방법)


피보나치 수열이 성립한다는 것을 알 수 있다.


이제 f(1)과 f(2)만 구하면 된다.


계단 1개 : 1개(1개로 한번에)

계단 2개 : 2개(1개씩, 2개로 한번에)


계단 n개를 올라가는 방법은

1, 2, 3, 5, 8, 13, 21, 34, 55, 84....

이렇게 된다.



  • 재귀함수 이용



  • 반복문 이용





최소 공배수란?


2개 이상의 수의 공배수 중 가장 작은 수


5의 배수 : 5, 10, 15, 20. 25, 30. 35, 40...

7의 배수 : 7, 14, 21, 27, 35, 42...


5와 7의 최소 공배수 = 35


식으로 나타내면

f(X, Y)는 정수 X와 Y의 최소 공배수

G는 정수 X와 Y의 최대 공약수

라고 할때


f(X, Y) = (X × Y) / G

이다



물론, 이러한 수학식을 몰라도

최소 공배수를 구할 수 있다.





하지만 최대 공약수와 위의 식을 활용하면

조금 더 효율적으로 최소 공배수를 구할 수 있다.


최대 공약수는 유클리드 호제법을 활용하면 쉽게 구할 수 있다.


최대 공약수 & 유클리드 호제법 보기(클릭)








최대 공약수란?

2개 이상의 수의 공약수 중 가장 큰 수


10의 약수 : 1, 2, 5, 10

15의 약수 : 1, 3, 5, 15


10과 15의 공약수 : 1, 5


10과 15의 최대 공약수 = 5



  • 수학 공식없이 반복문으로 찾는 방법



1부터 반복문으로 두 수 모두를 나눌 수 있는 수를 검색


반복은 입력된 수 중 작은 숫자까지만





  • 유클리드 호제법을 활용하여 찾는 방법


유클리드 호제법(Euclidean algorithm)


두 정수 혹은 두 다항식의 최대 공약수를 구하는 알고리즘

정수 : X, Y (X ≠ 0, Y ≠ 0X > Y)
나머지 : Z (X를 Y로 나눴을때 나머지)
최대 공약수 : f(X, Y)

라고 하면

f(X, Y) = f(Y, Z)
라고 할 수 있다는 것이 유클리드 호제법이다.

공식으로 보면, 이해하기 어렵지만 숫자로 보면 쉽게 이해가 된다.

예를 들어
X = 1480, Y = 540 이라고 하자

1480 = 540 x 2 + 400
540 = 400 x 1 + 140
400 = 140 x 1 + 120
140 = 120 x 1 + 20
120 = 20 x 6 + 0

나머지가 0이 되는 20이 최대 공약수이다.

f(x, y)식으로 적어보면 이렇다.
f(1480, 540) = f(540, 400) = f(400, 140) = f(140, 120) = f(120, 20) = 20


-재귀함수 이용

-반복문 이용













우선순위 큐를 활용한 정렬 알고리즘


정렬되지 않은 데이터들을 우선순위 큐에 입력하고


출력되는 순서대로 나열하며 정렬 종료


우선순위 큐 & 힙(클릭)





내림차순 정렬을 위해선 최대 힙을 사용






내림차순 정렬을 위해선 최소 힙을 사용






'알고리즘 > 정렬 알고리즘' 카테고리의 다른 글

병합 정렬(Merge Sort)  (0) 2017.02.03
기수 정렬(Radix Sort)  (0) 2017.02.02
퀵 정렬(Quick Sort)  (0) 2017.02.01
셸 정렬(Shell Sort)  (1) 2017.01.25
버블 정렬(Bubble Sort)  (0) 2017.01.25























'알고리즘 > 정렬 알고리즘' 카테고리의 다른 글

힙 정렬(Heap Sort)  (1) 2017.02.04
기수 정렬(Radix Sort)  (0) 2017.02.02
퀵 정렬(Quick Sort)  (0) 2017.02.01
셸 정렬(Shell Sort)  (1) 2017.01.25
버블 정렬(Bubble Sort)  (0) 2017.01.25



























'알고리즘 > 정렬 알고리즘' 카테고리의 다른 글

힙 정렬(Heap Sort)  (1) 2017.02.04
병합 정렬(Merge Sort)  (0) 2017.02.03
퀵 정렬(Quick Sort)  (0) 2017.02.01
셸 정렬(Shell Sort)  (1) 2017.01.25
버블 정렬(Bubble Sort)  (0) 2017.01.25






  • 퀵 정렬


리스트의 데이터 중 기준이 되는 하나의 데이터를 선정 => 기준(Pivot)

기준(Pivot)을 선택하는 방법은 많지만, 아래의 설명과 코드에선 중간에 있는 데이터를 기준(Pivot)으로 선정


기준(Pivot)보다 작은 데이터들을 왼쪽, 큰 데이터들을 오른쪽으로 정렬


정렬 완료 후 기준(Pivot)을 기점으로 좌우로 분할하여
다시 정렬


분할된 그룹의 크기가 1이하가 될때까지 반복







































'알고리즘 > 정렬 알고리즘' 카테고리의 다른 글

병합 정렬(Merge Sort)  (0) 2017.02.03
기수 정렬(Radix Sort)  (0) 2017.02.02
셸 정렬(Shell Sort)  (1) 2017.01.25
버블 정렬(Bubble Sort)  (0) 2017.01.25
삽입 정렬(Insertion Sort)  (0) 2017.01.25

+ Recent posts