알고리즘 7

전위, 중위, 후위 연산자 / 후위 표기식 변환

중위 표기식은 a+b 처럼 연산자가 가운데에 오는 평상시에 쓰는 식의 형태를 말한다. 그렇다면 전위, 후위 연산은 무엇일까?설명a=0, b=0, c=0 ++a (a=1)b++ (b=1) c = ++a (a=2, c=2) ... a 증가 -> c에 대입c = b++ (b=2, c=1) ... c에 대입 -> b 증가 c = (a++)+(++b) (a=3, b=3, c=5) ... b 증가 -> 덧셈 -> c 대입 -> a 증가 1. PostFixNotation 중위 표기식의 한계사람이 사용하는 중위 표기식 계산은 컴퓨터 계산으로 활용하기 힘들다.계산식의 우선순위를 논리적으로 판단하기 힘들기 때문이다.그로 인해 후위 표기 방법을 사용하며, 중위 표기식을 후위 표기로 변환하는 알고리즘들이 만들어진다. 그 중 ..

카테고리 없음 2017.07.20

피보나치 수열 (재귀적, 반복적)

#include int fib1(int); //재귀형 피보나치 함수(Recursive) int fib2(int); //반복형 피보나치 함수(Iterative) void main() { int x; printf("재귀형->1\n반복형->2\n입력:"); scanf("%d", &x); int n; printf("\n몇번째항?\n입력:"); scanf("%d", &n); switch (x) { case 1: //재귀 { int a = fib1(n); printf("%d \n", a); break; } case 2: //반복 { unsigned int b = fib2(n); printf("%d\n", b); break; } } } int fib1(int n) //재귀형 피보나치 함수(Recursive) { /*..

카테고리 없음 2017.07.20

이항계수 (파스칼의 삼각형)

#include void main() { int n, k; n = 20; k = 20; int ** B = new int *[n]; for (int i = 0; i < n; i++) { B[i] = new int[k]; } for (int i = 0; i < n; i++) { int min = 0; if (i < k) min = i + 1; //min=i일때 i가 0이면 0번반복이되게되는걸 막음. else min = k; for (int j = 0; j < min; j++) { if (j == 0 || j == i) B[i][j] = 1; else B[i][j] = B[i - 1][j - 1] + B[i - 1][j]; printf("%d", B[i][j]); } printf("\n"); } } #inc..

카테고리 없음 2017.07.20

최대공약수 구하기 (유클리드의 알고리즘)

두 수 A,B가 있다고 하자. 둘의 최대공약수를 G라고 하면 A = G*aB = G*b 로 표현할 수 있다. 그리고 A - B = G*(a-b) 이므로A와 B의 최대공약수는 A-B와의 최대공약수이기도 하다. 이 원리를 이용해서62와 28의 최대공약수를 구해보면(62, 28)(34, 28)(6, 28)(6, 22)(6, 16)(6, 10)(6, 4)(2, 4)(2, 2)(0, 2) 0이 나오면 종료. 최대공약수는 2 그러나 이 방식을 프로그램으로 구현하면 큰 차이가 나는 수들은 루프를 비교적 많이 돌게 된다. 이를 개선시켜 여러번의 뺄셈을 나눗셈으로 줄여 계산하는 방법이 있다.(62, 28)62 % 28 = 6 --> (28, 6)28 % 6 = 4 --> (6, 4)6 % 4 = 2 --> (4,2)4 ..

카테고리 없음 2017.07.20

다익스트라(Dijkstra), 벨만 포드(Bellman-Ford)

메인 클래스는 알아서 만들어서 쓰면 된다. 개선 방법은 쓰지 않음. 다익스트라 예를 들어, 0에서 가장 가까운 곳은 5번 노드(거리1)이다. 그럼 5번 노드가 vnear이 되고 5번 노드를 경유해서 가는 루트를 고려하여 최소길이를 갱신(이전가지는 0에서 바로 가는 루트들이 최소인 것이다) 그 다음 5번 노드는 제외하고 다음으로 가까운 곳은 1번 노드이니 1번 노드가 vnear이 되고 아까 5번 노드를 경유한 루트도 고려하여 갱신된 최소 루트들을 1번 노드를 경유하는 것도 고려하여 또다시 갱신 이와 같은 방법으로 마지막 노드까지 반복 벨만 포드 시작점 고정시키고 경유지랑 목적지를 이중 반복문 돌려서 경유한 길이와 원래 길이를 비교해서 짧은 것으로 갱신 갱신할 때 마다 길이값들이 달라지므로 다시 비교가 필요..

카테고리 없음 2017.07.20

동적계획법(Dynamic Programming), 탐욕적 방법(Greedy Algorithms)

먼저 책이랑 프린트를 보시오.. 동적계획법(dynamic programming) - 문제를 여러개의 하위 문제로 나누어 푼다음 결합 (이전의 결과를 활용하여 다음 결과를 산출하는 것)- 문제를 해결하기 위한 모든 방법을 검토하고, 그 중에 최적의 풀이를 찾아냄.-> 느릴 수 있으나 정확한 결과를 갖다 줌.ex) 플로이드, 벨만포드, 다익스트라, 비터비, 배낭문제, CYK(Cocke-Younger-Kasami) 1) 플로이드-워셜 알고리즘- 경유점, 시작점, 끝점을 모두 루프를 돌아 모든 노드 쌍들에 대한 최단의 경로를 선택. 2) 벨만-포드 알고리즘- 시작점은 고정되어 있고, 경유점, 끝점 루프를 돌아 시작점으로 부터 최단의 경로를 선택.- 시작점이 고정되있는걸 빼면 플로이드와 유사하고, 음수를 처리할 ..

카테고리 없음 2017.07.20

연역법, 귀납법

명제를 세운 뒤 논거를 제시하면서 결론에 이르는 과정이 추론입니다.추론의 대표적인 방법으로는 연역법, 귀납법 등이 있습니다. 연역법 일반적인 원리를 가지고 구체적이고 특수한 사실을 증명하는 방법 모든 동물은 죽는다. -- 대전제(일반적 원리)사람은 동물이다. -- 소전제(구체적 사실)그러므로 사람은 죽는다. -- 추 론(구체적 원리) 간단히 설명하자면 근본적이고 증명된 원리를 이용 한 전개입니다따라서 반박의 여지가 별로없지요 사람은 언젠가 죽는다당신은 사람이다그러므로 당신은 언젠가는죽는다 (결론) 귀납법 귀납법은 쉽게 말하면 몇가지 예 를 통해서 일반적인 속성을 끌어내는 방법입니다과학실험 등이 이런 류이지요 여러 가지 구체적인 사실에서 공통적으로 나타난 현상을 통해 일반적인 원리를 이끌어내는 방법 사람은..

카테고리 없음 2017.07.20