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

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


규칙

한번에 한 원판만 이동 가능

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

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











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

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


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


-재귀함수 이용

-반복문 이용









  • 특징





각각의 노드는 고유한 키값이 존재


각 키값은 중복될 수 없다!


자식 노드는 최대 2개 까지


부모보다 작은 노드는 왼쪽에, 큰 노드는 오른쪽에 위치한다


탐색은 항상 최상단 루트(Root)부터




  • 삽입





새 노드의 위치를 찾기 위해서 루트(Root)부터 탐색한다.


탐색한 노드보다 새 노드가 작으면 왼쪽, 크면 오른쪽으로 계속 탐색


다음 탐색 위치가 비어있다면, 그 위치에 새 노드 삽입





삽입 종료






  • 삭제


삭제는 몇가지 종류로 나뉜다.

01. 자식이 없는 노드 삭제

02. 자식이 한쪽만 있는 노드 삭제

03. 자식이 양쪽 다 있는 노드 삭제



    • 자식이 없는 노드 삭제

가장 간단한 경우 이다.

그냥 삭제하면 된다.




    • 자식이 한쪽만 있는 노드 삭제    


삭제할 노드의 자식을

삭제노드의 위치로 옯겨주고

노드를 삭제하면 된다.








    • 자식이 양쪽 다 있는 노드 삭제


자식이 양쪽 다 있는 노드를 삭제할때

왼쪽에서 가장 큰 노드를 찾아 삭제노드 위치에 두는 방법

오른쪽에서 가장 작은 노드를 찾아 삭제노드 위치에 두는 방법등

여러 방법은 많지만, 아래의 방법은 왼쪽에서 가장 큰 노드를 찾는 방법이다.




왼쪽에서 가장 큰 노드는 오른쪽 자식 노드가 없기 때문에

고려하지 않아도 된다.




    • 삭제 전체 코드




  • 전체 코드












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


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


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


우선순위 큐 & 힙(클릭)





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






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






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

병합 정렬(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)


힙은 데이터에서 최대값(혹은 최소값을) 빠르게 찾을 수 있는 자료구조

힙은 완전 이진 트리다.

우선순위가 가장 높은 데이터가 제일 앞(루트)에 위치한다.

부모는 자식보다 우선순위가 더 높은 데이터가 배치된다.
(ex. 큰 데이터가 더 우선된다면, 모든 부모 노드는 자신의 자식 노드보다 더 크다)

대표적으로 최대 힙과 최소 힙이 있다.

최대 힙(Max Heap) : 
데이터 중 가장 큰 값이 루트에 위치
모든 부모 노드는 자식보다 크거나 같다.

최소 힙(Min Heap) :
데이터 중 가장 작은 값이 루트에 위치
모든 부모 노드는 자식보다 작거나 같다.






  • 배열을 활용한 힙 구현








  • 우선순위 큐(Priority Queue)



데이터들이 우선순위를 갖는다.

입력순서에는 상관없이 우선순위가 높은 데이터가 가장 먼저 처리된다.

아래의 모든 설명은 최대 힙을 활용한 우선순위 큐이다.





  • 삽입














  • 삭제








  • 전체 코드

























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

힙 정렬(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