목록알고리즘 (5)
나의 지식 보관소
수식을 표기하는 방법에는 우리가 흔히 사용하는 중위 표기법말고도 전위 표기법과 후위 표기법이라는 것이 있다. 중위 표기법 -> ( 1 + 2 ) * 7 후위 표기법 -> 1 2 + 7 * 전위 표기법 -> * + 1 2 7 이러한 전위, 후위 표기법의 특징은 연산자의 순서에 따라 연산순서가 결정되기 때문에 연산자 우선순위나 소괄호가 필요없다는 점이다. 중위 표기법을 후위 표기법으로 바꾸는 법 피연산자가 들어오면 바로 출력한다. 연산자가 들어오면 스택에 들어있는 연산자와 비교해서 스택에 있는 연산자보다 우선순위가 높으면 스택에 쌓고, 낮으면 스택에 있는 들어온 연산자보다 우선순위가 낮은 연산자를 모두 출력하고, 들어온 연산자를 스택에 쌓는다. 연산자 우선순위는 ㆍ *, / : 제일 높다 ㆍ +, - : 두..
하노이의 탑은 대표적인 재귀함수의 예시이다. 세 개의 기둥에 크기가 다른 여러 개의 크기가 다른 원판들이 있고, 처음 기둥에서 다른 기둥으로 모든 원판을 옮기면 된다. 단, 아래의 조건들을 만족해야한다. 1. 한 번에 하나의 원판만 옮길 수 있다. 2. 큰 원판이 작은 원판 위에 있어서는 안 된다. 구현된 코드는 다음과 같다. #include int main(void) { int diskCount; printf("Set disk count : "); scanf("%d",&diskCount); hanoi(diskCount,'A','B','C'); } void move(int diskNum, char from, char to) { printf("\n%d Disk move %c from %c", diskNum..
피보나치 수열은 0 1 1 2 3 5 8 13 21 ... 와 같이 전개되는 수열로서 재귀적인 형태를 띤다. 재귀적인 형태를 띠므로 재귀 함수를 통해 구현할 수 있는데, 코드는 다음과 같다. #include int main(void) { for (int i = 0; i < 20; i++) { printf("%d ", fibonacci(i + 1)); } return 0; } int fibonacci(int value) { if (value == 1) return 0; else if (value == 2) return 1; else return fibonacci(value - 1) + fibonacci(value - 2); } 피보나치 수열은 1번째는 0, 2번째는 1의 값을 반환하고 3번째 이후부터는 자..
재귀 함수는 함수 내에서 자기 자신을 다시 호출하는 함수를 의미한다. 종료 조건을 만족할 때까지 자기 자신을 호출하면서 주어진 작업을 수행한다. 팩토리얼을 구하는 코드로 예를 들겠다. #include int main(void) { printf("\b\b= %d", factorial(5)); return 0; } int factorial(int value) { printf("%d * ", value); if (value
이진 탐색 알고리즘을 사용하기 위해서는 배열에 저장된 데이터가 정렬되어있어야 한다. 다시 말해서 정렬되지 않은 배열에는 이진 탐색 알고리즘을 사용할 수 없다. 이진 탐색은 탐색의 범위를 반복해서 절반씩 줄이는 알고리즘이다. 배열 { 1,3,5,6,7,9,11,13,15,19 }에서 3을 찾는 과정은 다음과 같다. 첫 번째 시도 1 3 5 6 7 9 11 13 15 19 arr[1] arr[2] arr[3] arr[4] arr[5] arr[6] arr[7] arr[8] arr[9] arr[10] 1. 배열 인덱스의 시작과 끝을( 0과 10 ) 더해서 2로 나눈다. 2. 0과 10을 더해서 나눈 결과 5를 인덱스 값으로 해서 저장된 값이 3인지 확인한다. 두 번째 시도 1. arr[5]에 저장된 값이 3이 ..