c언어 163

그리디 알고리즘(Greedy Algorithm)

그리디 알고리즘은 매 선택에서 당장 눈 앞에 보이는 최적인 답을 선택하도록 하는 알고리즘이다. 대표적인 예제로는 거스름 돈 문제가 있다. 예를들어, 거스름 돈 1260원을 내주어야할 때 10원짜리 동전을 126개 내어주는 것보다는 500원짜리 동전 2개, 100원짜리 동전 2개, 50원짜리 동전 1개, 10원짜리 동전 1개로 총 6개의 동전을 내어주는 것이 더욱 편리하다. 그러므로 그리디 알고리즘은 무조건 큰 경우 혹은 무조건 작은 경우대로 문제에 접근하여 수행된다. [예제] #include int main() { int input, result = 0; scanf("%d", &input); result += input / 500; input %= 500; result += input / 100; inp..

플로이드 와샬 알고리즘 (Floyd Warshall Algorithm)

플로이드 와샬 알고리즘은 거쳐가는 정점을 기준으로 모든 정점에서 모든 정점으로의 최단 경로를 탐색하는 알고리즘이다. 다음과 같은 그래프가 존재할 때, 각각의 정점이 다른 정점으로 가는 거리(비용)을 2차원 배열로 나타내면 아래와 같다. 0 5 INF(무한) 8 7 0 9 INF(무한) 2 INF(무한) 0 4 INF(무한) INF(무한) 3 0 위 표는 현재까지 계산된 최소 비용이며, 이러한 2차원 배열을 반복적으로 갱신하여 모든 최소 비용을 구하는 과정은 아래와 같다. (1) 노드 1을 거쳐가는 경우 [ 2->3 ] 노드 1을 거쳐가야 하기 때문에 1을 포함하지 않은 경우들만 계산해주면 된다. 0 5 INF(무한) 8 7 0 [ 2->3 ] [ 2->4 ] 2 [ 3->2 ] 0 [ 3->4 ] INF..

백준(C) 11727번 2xn 타일링2 풀이

C로 구현한 2752번 2xn 타일링2 문제 풀이입니다. https://www.acmicpc.net/problem/11727 11727번: 2×n 타일링 2 2×n 직사각형을 1×2, 2×1과 2×2 타일로 채우는 방법의 수를 구하는 프로그램을 작성하시오. 아래 그림은 2×17 직사각형을 채운 한가지 예이다. www.acmicpc.net 이 문제의 규칙성을 찾기 위해서 아래의 글을 참고하시면 좋을거 같습니다. https://unie2.tistory.com/40?category=875841 백준(C) 11726번 2xn 타일링 풀이 C로 구현한 2752번 세수정렬 구하기 문제 풀이입니다. https://www.acmicpc.net/problem/11726 11726번: 2×n 타일링 2×n 크기의 직사각형..

백준(C) 11726번 2xn 타일링 풀이

C로 구현한 2752번 세수정렬 구하기 문제 풀이입니다. https://www.acmicpc.net/problem/11726 11726번: 2×n 타일링 2×n 크기의 직사각형을 1×2, 2×1 타일로 채우는 방법의 수를 구하는 프로그램을 작성하시오. 아래 그림은 2×5 크기의 직사각형을 채운 한 가지 방법의 예이다. www.acmicpc.net 문제에서 n이 1일 때 1x2 혹은 2x1 타일로 채우는 방법의 수는 1가지 이다. n이 2일 때는 가로로 긴 타일 2개를 붙여서 채우는 방법 하나와 세로로 긴 타일 2개를 붙여서 채우는 방법 하나로 총 방법의 수는 2가지 이다. n이 3일 때의 방법의 수는 3이며, 만약 이미 많은 타일이 채워져 있고 2개의 타일을 추가하고자 할 때 세로로 긴 타일을 추가하는 ..

다이나믹 프로그래밍(Dynamic Programming)

다이나믹 프로그래밍은 하나의 문제는 단 한 번만 풀도록 하는 알고리즘이다. 다이나믹 프로그래밍으로 피보나치 수열의 문제 점을 해결할 수 있는데, 피보나치 수열은 특정한 숫자를 구하기 위해 특정한 숫자 바로 앞에 있는 수와 두 칸 앞에 있는 수의 합을 구하는 방식이다. 피보나치 수열은 동일한 문제를 다시 풀어 비효율적이라는 문제점이 있다. 다이나믹 프로그래밍은 큰 문제를 작은 문제로 나눌 수 있고, 작은 문제에서 구한 정답은 그것을 포함하는 큰 문제에서도 동일하다는 가정 하에 사용이 가능하다. 다이나믹 프로그래밍을 통해 피보나치 수열의 문제점을 해결하기 위해서는 이미 계산한 결과를 배열에 저장함으로써 나중에 동일한 계산을 해야할 때 저장된 값을 단순히 반환하도록 한다. [예제] #include int d[..

합집합 찾기 알고리즘(Union-Find Algorithm)

유니온 파인드 알고리즘은 여러 개의 노드가 존재할 때 두 개의 노드를 선택하여 서로 같은 그래프에 속해 있는지 판별하는 그래프 알고리즘이다. 그림과 같이 부모를 합칠 때 일반적으로 더 작은 값 쪽으로 합친다. 그림에 대해 구체적으로 설명하자면, (1) 노드가 모두 연결되지 않은 상태에서의 각 노드의 부모노드는 자기 자신을 가리킨다. (2) 1과 2를 연결하면 2의 부모노드는 더 작은 값인 1 이다. (3) 2와 3을 연결하면 3의 부모노드는 더 작은 값인 2 이지만, 재귀 함수를 통해 결과적으로 1이 부모노드가 된다. [예제] #include int getParent(int parent[], int x) { if(parent[x] == x) return x; return parent[x] = getPar..

계수 정렬(Counting Sort)

계수 정렬은 크기를 기준으로 개수를 세는 것이며, 범위조건이 있는 경우에 한해서 사용된다. 5이하의 자연수 데이터들이 있다고 가정할 때, 계수 정렬은 배열 첫번째 요소부터 시작하여 해당 값이 등장할 경우 개수를 하나씩 증가시킨다. 1, 3, 2, 4, 3, 2, 5 --> 1개, 0개, 0개, 0개, 0개 1, 3, 2, 4, 3, 2, 5 --> 1개, 0개, 1개, 0개, 0개 1, 3, 2, 4, 3, 2, 5 --> 1개, 1개, 1개, 0개, 0개 1, 3, 2, 4, 3, 2, 5 --> 1개, 1개, 1개, 1개, 0개 1, 3, 2, 4, 3, 2, 5 --> 1개, 1개, 2개, 1개, 0개 1, 3, 2, 4, 3, 2, 5 --> 1개, 2개, 2개, 1개, 0개 1, 3, 2, 4,..

힙정렬(Heap Sort)

힙정렬은 힙 트리 구조를 이용하는 정렬 방법이다. 여기서 힙 트리 구조는 최소값이나 최대값을 신속하게 찾아내기 위해 완전 이진 트리를 기반으로 하는 트리이다. 최대 힙은 부모노드가 자식노드보다 값이 큰 힙이다. (1) 부모노드인 7이 자식노드인 5와 3보다 크다. (2) 부모노드인 11이 자식노드인 9와 8보다 크다. (3) 부모노드인 9가 자식노드인 7과 4보다 크다. ==> 그러므로 두 트리 모두 최대 힙이다. [오름차순 정렬] 위 그림들은 오름차순 정렬을 수행하기에 앞서 최대 힙을 구성한 것입니다. 부모노드가 자식노드보다 작을 경우 값을 바꿔줌으로써 부모노드의 값이 더 크게 구성해줍니다. 이제 오름차순 정렬을 수행하는데 트리를 반으로 나눈 후 가장 최상위에 있는 루트노드 값을 가장 뒤쪽으로 보내면서..

병합정렬(Merge Sort)

병합정렬은 원소들을 반으로 나누고 계산(정렬)한 후 나중에 합치는 것이다. 배열 {7,6,5,8,3,5,9,1} 이 있다고 가정하였을 때 오름차순으로 정렬을 시도한다면, 7 6 5 8 3 5 9 1 --> 크기가 1인 배열로 개별적으로 나눈다. 7 6 5 8 3 5 9 1 --> 67 58 35 19 --> 2개씩 묶도록 하며, 각각의 정렬 처리를 한다. 67 58 --> 5678 --> 67과 58을 비교하여 정렬 처리를 한다. 35 19 --> 1359 --> 35와 19를 비교하여 정렬 처리를 한다. 5678 1359 --> 13556789 --> 5678과 1359를 비교하여 정렬 처리를 한다. => 최종적으로 1 3 5 5 6 7 8 9 가 이루어진다. [예제] #include int num =..