본문 바로가기
반응형

알고리즘9

acm 3n+1 ●어떤 정수 n에서, n이 짝수면 2로 나누고, 홀수면 3을 곱한 후 1을 더한다. 이렇게 해서 새로 만들어진 숫자를 n으로 놓고 n이 1이 될 때까지 같은 작업을 반복한다. 예를 들어 n이 22이면 다음과 같은 수열이 만들어 진다.22 11 34 17 52 26 13 40 20 10 5 16 8 4 2 1n이라는 값이 입력되었을 때 1이 나올때 까지 만들어진 수의 개수를 n의 사이클 길이라고 한다. 위에 있는 수열을 예로 들면 22의 사이클 길이는 16이다. i와 j라는 두개의 수가 주어졌을 때 i,j사이의 모든수에 대해 최대 사이클 길이를 구하라 ●소스 코드 #include int func1(int a){int cn=1;while(a!=1){if((a%2)==0){a=a/2;cn++;}else{a=3.. 2014. 1. 20.
알고리즘 분기한정(Branch and Bound) ●분기한정(Branch and Bound) - 백트래킹과는 달리, 분기와 한정을 정해서 해를 구하는 기법이다. 백트래킹을 구현할 때 경우의 수가 너무 많아 모든 경우를 다 해보기 어려울 때, 사용하면 좋다. 가지치기하는 기준이 되는 값이 바운드 값이다. 너비우선탐색을 사용한다. ●너비우선탐색(BFS, Breadth First Search) - 반복문과 큐를 이용하여 구현한다. 경로가 길 경우에는 탐색 가지가 급격히 증가함에 따라 보다 많은 기억 공간을 필요로 하게 된다. DFS 보다 많은 자료를 처리할 경우에 적합한다. ●큐(queue) - 먼저 집어 넣은 데이터가 먼저 나오는 FIFO(First In First Out)구조이다. ●BFS기법 - 시작점과 연결된 모든 정점을 방문한다. - 시작점과 연결된.. 2012. 4. 9.
알고리즘 백트래킹(Backtracking) ●백트래킹 - DFS(깊이우선탐색)방식으로 해를 찾는 방법이다. DFS는 해를 찾기 위해 전진, 후진을 반복한다. 백트래킹 재귀 호출을 해서 구현하면 편리하다. ●깊이우선탐색(DFS, Depth First Search) - 답을 찾을 때 가장 위에서 가장 아래쪽으로 들어 갔다가, 제일 밑에 까지 왔을 때 더 들어갈 곳이 없으면 위로 나왔다가 다시 가장 끝까지 들어가는 동작을 되풀이 한다. 여기서 위로 나오는 동작을 백트래킹이라고 한다 ●스택(stack) - 나중에 입력된 데이터가 먼저 빠져 나오는 구조이다. 후입선출(LIFO) ●사용하는 재귀함수의 수는 수학의 "경우의 수"와 같다. 예를들어 동전,주사위 등의 문제를 코딩할 때 각각의 무제의 경우의 수만큼의 재귀호출을 사용한다. ●백트래킹 알고리즘으로 해.. 2012. 4. 8.
알고리즘 정렬(sort) - 퀵정렬(Quick sort) ●퀵정렬(Quick sort) - 어느 한 값을 기준으로 이 값보다 작은값을 갖는 데이터와 큰 값을 갖은 데이터를 분리하여 2개의 그룹으로 나눈다. 그리고나서 각 그룹에 대해 위 작업을 재귀적으로 반복해서 정렬한다. 다른 정렬보다 평균적인 실행시간이 빠르다. ●퀵정렬 코드( 제대로 정렬이 안됨, 나중에 수정) #include #include int i, n = 10, data[10] = {3, 7, 8, 2, 9, 1, 4, 7, 6, 5}; void quick(int array[], int left, int right) { int choice; int i, j, temp; if(left=j) //교환할 데이터가 없으면 break break; temp=array[i]; array[i]=array[j]; .. 2012. 4. 1.
알고리즘 정렬(sort) - 선택정렬(Selection sort) ●선택정렬(Selection sort) - 데이터에서 가장 큰 값을 찾아서 마지막 위치에 있는 데이터와 교환하고, 그 다음 두번째로 큰 값을 갖은 데이터를 찾아서 마지막 전 위치에 있는 데이터와 교환한다. 이런식으로 모든 데이터를 정렬한다. ●선택정렬 코드 #include int i, n=10, data[10] = {32, 1, 15, 2, 7, 3, 9, 7, 92, 12}; void select(int array[], int n) { int i, j, temp; for(i=0; i 2012. 4. 1.
알고리즘 정렬(sort) - 삽입정렬(Insert sort) ●삽입정렬(Insert sort) - 자료 배열의 모든 요소를 앞에서부터 차례대로 이미 정렬된 배열 부분과 비교하여, 자신의 위치를 찾아 삽입함으로써 정렬을 완성하는 알고리즘이다. 배열이 길수록 효율은 떨어진다. 출처 - 위키백과 ●삽입정렬 코드 #include int i, n=10, data[10] = {30,5, 32,11, 98, 34, 12, 54, 32, 543}; void insert(int array[], int n) { int temp, k; temp = k = 0; for(i=1; i=0 && array[k]>temp) { array[k+1] = array[k]; k--; array[k+1] = temp; } } } void output() { for(i=0; i 2012. 4. 1.
알고리즘 정렬(sort) - 버블정렬(Bubble sort) ●버블정렬(Bubble sort) - 인접한 두개의 데이터의 값을 비교해서 정렬되어 있지 않으면 교환하는 정렬이다. 이런방법으로 마지막까지 비교하고 교환하면 한 단계가 끝난다. 그리고나서 2번째 데이터부터 다시 두개의 데이터의 값을 비교해 나가면서 비교한다. 다른 정렬에 비해 정렬 속도는 느리지만 코드는 단순하다. ●버블정렬 코드 #include int i; int n=10; //n은 데이터 개수 int data[10]={30,40,20,10,43,12,54,87,34,1}; void bubble(int array[], int n) { int i, j, temp; for(i=0;i 2012. 4. 1.
알고리즘 그리디(greedy) 알고리즘 ●그리디(greedy) 알고리즘 - 여러 경우 중 하나를 결정해야 할 때마다 그 순간에 최적이라고 생각되는 것을 선택해 나가는 방식으로 진행하여 최종적인 해답에 도달한다. 순간마다 하는 선택은 그 순간에 대해 지역적으로는 최적이지만, 그 선택들을 계속 수집하여 최종적(전역적)인 해답을 만들었다고 해서, 그것이 최적이라는 보장은 없다. 출처 - 위키백과 ●쉽게 설명하면 모든 경우의 수를 구하는게 아니라 하나를 선택하고, 그 선택한 순간에 최적이라고 생각하는 것을 하나 선택하면서 최적해를 구하는 알고리즘이다. 그렇기 때문에 전체적으로 최적이 아닌 경우가 나올수도 있다. 그래서 그리디 알고리즘을 구현할 때는 전체적인 최적이 될것인지를 염두해 두고 알고리즘을 구현해야 한다. ●Dijkstra(다익스트라)의 최단.. 2012. 3. 29.
알고리즘 피보나치 수열 ●피보나치 수열 개념 - 첫 번째 항의 값이 0이고 두 번째 항의 값이 1일때, 이후의 항들은 이전의 두 항을 더한 값으로 이루어지는 수열을 말한다. [출처] 피보나치수열 [Fibonacci sequence ] | 네이버 백과사전 ●피보나치 수열은 재귀호출(Recursive Call)을 사용해서 구하면 편리하다. ●문제 - 첫항과 둘째항이 1, 1인 경우에, 20번째 피보나치 수열의 값을 구하여라. #include int fino(int n) { if(n==1 || n==2){ return 1; } else{ return fibo(n-1) + fibo(b-2); } } void main(){ int a; scanf("%d", &a); printf("%d", fibo(a)); } 2012. 3. 26.
반응형