Algorithm(38)
-
조합 (Combination)
- 조합 (Combination) - n개의 수를 중복을 허용하지 않고(start) r개를 순서 상관없이 나열할 수 있는 모든 경우의 수 (1 ≤ r ≤ n) 문제인식) 0부터 9(n)까지의 수가 있다. 이들을 이용하여 4(r)개의 수를 중복없이, 순서 상관없이 나열하고자 할 때 가능한 모든 경우를 각각 한 줄씩 출력하고자 한다면 어떻게 해야할까? int n=9, r=4; 해결과정) 1) 출력에 이용할 배열(a[4])을 준비한다. 2) 함수의 인수를 idx, start로 설정한다. idx는 a배열에 재귀진입하기위한 인덱스, start는 중복방지와 오름차순을 위한 시작점이다. 만약 1, 2, 3, 4의 네 수를 순열로 처리한다면... (이 경우, n=4, r=4, start=1인 셈) "1 2 3 4" "..
2022.04.20 -
순열 (Permutation) - 교환방식
- 순열 (Permutation) - n개의 수를 중복을 허용하지 않고(visited) r개를 나열할 수 있는 모든 경우의 수 (1 ≤ r ≤ n) 문제인식) 1부터 3(n)까지의 수가 있다. 이들을 이용하여 3(r)개의 수를 중복없이 나열하고자 할 때 가능한 모든 경우를 각각 한 줄씩 출력하고자 한다면 어떻게 해야할까? int n=3, r=3; 해결과정) 1) 현재위치(dpth)와 맞바꿀 위치(i)간에 swap을 진행한다. dpth는 재귀의 깊이이자 맞바꿀 위치의 시작. 2) 맞바꿀 위치(dpth)를 옮기기위해 다음 위치(dpth+1)로 재귀적 진입을 한다. 3) 깊은재귀가 끝나면 윈위치시킨다.(다시 swap) (※ [더보기]를 클릭하면 C/C++ 소스코드를 참조할 수 있습니다.) 더보기 #includ..
2022.04.11 -
순열 (Permutation) - 삽입방식 | (+중복순열, +함수사용)
- 순열 (Permutation) - n개의 수를 중복을 허용하지 않고(visited) r개를 나열할 수 있는 모든 경우의 수 (1 ≤ r ≤ n) 문제인식) 0부터 9(n)까지의 수가 있다. 이들을 이용하여 4(r)개의 수를 중복없이 나열하고자 할 때 가능한 모든 경우를 각각 한 줄씩 출력하고자 한다면 어떻게 해야할까? int n=9, r=4; 해결과정) 1) 출력에 이용할 배열(a[4]-주황)과 숫자의 중복방지를 위한 방문여부배열(visited[10]-파랑)을 준비한다. 2) 이 배열의 인덱스(idx)마다 0~9까지 삽입하는 반복문을 실행한다. idx는 재귀를 위한 인덱스. 3) 현재 인덱스(idx)에서 사용한 수(i)를 다음 인덱스(idx+1)에서 사용하지 않기 위해 방문처리(visited[i]=1..
2022.04.10 -
삽입정렬 (Insertion Sort)
- 삽입정렬(Insertion Sort) - 정렬을 수행할 위치(i)의 값을 저장(tmp)하고 미리 정렬된 왼쪽 부분(j) 중 적절한 위치에 삽입하는 정렬 문제인식) 다음 그림과 같은 수(數)의 배열이 있다. int a[10] = {10, 2, 1, 9, 7, 4, 5, 8, 6, 3}; 이 배열을 오름차순 정렬, 즉 가장 작은 수부터 차례대로 정렬하기 위해선 어떻게 프로그래밍 해야할까? 해결과정) 0) 아래 그림은 이미 4번의 정렬이 이뤄졌다고 가정한 상태이다. 즉, 5번째의 정렬이 이뤄져야 할 상태이며, 4번째 원소까지는 이미 오름차순 정렬이 되어있는 부분이다. 1) 정렬을 수행할 위치를 선정하고 그 값을 저장한다. 2) 왼편에 있는 원소들이 저장한 값보다 크다면 한 칸씩 뒤로 밀어둔다. 3) 적절..
2022.03.29 -
버블정렬 (Bubble Sort) | (+Special Sort)
- 버블정렬(Bubble Sort) - 탐색해나갈 경계(i)를 정하고 현재 위치(j)의 바로 옆 위치(j+1)의 원소들과 비교, 맞바꾸는 정렬 문제인식) 다음 그림과 같은 수(數)의 배열이 있다. int a[10] = {10, 2, 1, 9, 7, 4, 5, 8, 6, 3}; 이 배열을 오름차순 정렬, 즉 가장 작은 수부터 차례대로 정렬하기 위해선 어떻게 프로그래밍 해야할까? 해결과정) 1) 탐색해나갈 범위의 경계를 잡는다. 2) 범위를 잡았으면 현재 위치의 바로 옆 원소와 비교, 맞바꾸기를 경계전까지 연속적으로 실행해나간다. (※ [더보기]를 클릭하면 C/C++ 소스코드를 참조할 수 있습니다.) 더보기 int n, i, j, idx, tmp; int a[10] = {10, 2, 1, 9, 7, 4, ..
2022.03.28 -
선택정렬 (Selection Sort)
- 선택정렬(Selection Sort) - 기준 위치(i)에서 나머지 원소들을 탐색(j)하여 가장 작은 값의 위치(idx)를 선택하고 맞바꾸는 정렬 문제인식) 다음 그림과 같은 수(數)의 배열이 있다. int a[10] = {2, 10, 1, 9, 7, 4, 5, 8, 3, 6}; 이 배열을 오름차순 정렬, 즉 가장 작은 수부터 차례대로 정렬하기 위해선 어떻게 프로그래밍 해야할까? 해결과정) 1) 기준 위치를 배열의 가장 왼쪽부터 차례대로 잡아나갈 것이고, 2) 기준위치를 잡았으면 그 나머지 원소들을 탐색하여 그들 중 가장 작은 값(최솟값)의 위치를 찾을 것이다. (값 자체가 아닌 위치를 찾는 이유는 곧 나온다.) 3) 그리고는 기준 위치의 원소랑 최솟값 위치의 원소랑 맞바꾸는 것이다. (※ [더보기]..
2022.03.28