프로그래밍/Algorithm 10

알고리즘 실전 활용을 위한 요약

알고리즘을 실전에 활용하기 위해서, 간단하게 어떤 알고리즘이 어떤 역할을 수행하는지에 대한 요약글을 적어보려한다.나동빈님의 알고리즘 강의를 수강하면서 차곡차곡 적어나가보도록 하겠다. 등장하는 사진의 출처는 역시 나동빈님의 블로그/강의다.영어/한국어/줄임말 모두로 제목을 걸어놓았으니 Ctrl + F로 원하는 알고리즘을 찾으면 된다. 너비 우선 탐색 (Breath First Search, BFS)최단 길이를 보장해야 할 때 많이 사용한다. 현재 노드에서 가장 가까운 노드부터 방문하는 것으로,위와 같은 그래프일때 1부터 탐색을 시작하면 1 - 2 - 3 - 4 - 5 - 6 - 7의 순서로 방문하게 된다. 추후 다른 알고리즘에 활용되는 기본 알고리즘이다. 깊이 우선 탐색 (Depth First Seach, D..

[JAVA] 재귀함수를 이용한 미로 찾기

요즘 인프런에서 알고리즘 강좌를 듣고있는데,내가 진짜 약했던 재귀 부분을 배우고 있다. 다음은 재귀를 사용한 미로찾기 코드이다. 재귀함수를 만들때는...항상 베이스케이스를 생각하고, 베이스 케이스가 아닌 부분에서 베이스케이스로 수렴할 수 있도록 구현하는게 중요한 것 같다. 1234567891011121314151617181920212223242526272829303132333435363738394041424344454647484950515253545556575859606162636465666768697071727374757677787980import java.awt.*;import java.io.*;import java.util.ArrayList;import java.util.HashMap;import ..

[C++] 이진 탐색 트리 구현하기 (Binary Search Tree)

이진 탐색 트리 (Binary Search Tree)이진 탐색트리는 데이터의 크기에 따라 노드의 위치가 다르다.정의는 아래와 같다. (1) 모든 원소는 서로 다른 유일한 키를 갖는다.(2) 왼쪽 서브 트리에 있는 원소의 키는 그 루트의 키보다 작다.(3) 오른쪽 서브 트리에 있는 원소의 키는 그 루트의 키보다 크다.(4) 왼쪽 서브트리와 오른쪽 서브트리도 이진 탐색 트리이다. 이진 탐색 트리 C++ 구현이제 이진 탐색트리를 구현할텐데,- 탐색(search)- 삽입(insert)두 가지 기능을 수행하도록 할 것이다.구현해볼 이진 탐색트리는 아래와 같이 생겼다. 주황색 표시된 부분은 새로 추가해볼 노드다.1234567891011121314151617181920212223242526272829303132333..

[C++] 이진 트리 구현하고 순회하기 (Binary Tree in C++)

이진트리(Binary Tree)란?모든 노드의 차수를 2 이하루 정하여 전체 트리의 차수가 2 이하가 되도록 만든 것이 이진트리다.이진트리는 왼쪽 자식노드와 오른쪽 자식노드 2개만을 가질 수 있으며, 공백노드도 이진트리의 노드로 취급한다.이진트리의 서브트리 모두 이진트리이다. 이진트리의 종류이진트리는 포화 이진 트리(Full binary tree), 완전 이진트리(Complete binary tree), 편향 이진트리(Skewed binary tree) 3가지가 있다.포화 이진트리는 모든 레벨에 노드가 꽉찬 이진트리를 말하며, 공백 노드가 없다.즉 트리의 높이가 h 일때 2^(h+1) - 1 개의 최대 노드수를 갖는 이진트리이다. 완전 이진트리는 노드 개수가 n 개일 때, 노드의 위치가 포화 이진트리의 ..

자료구조 : 큐(Queue) 이해하고, 구현하기 in C++

Queue 1분만에 파악하기! 큐(Queue)은 선입선출 (First In First Out, FIFO) 자료구조이다. 먼저 넣은 자료가 가장 마지막에 나오는 스택(Stack)과는 반대이다. >> 스택에 대한 포스트를 참조 큐에 자료를 넣는 행동은 Put(또는 Enqueue), 꺼내는 행동은 Get(또는 Dequeue)이라고 하며 큐의 제일 앞에 있는 자료를 Front(또는 Head), 가장 뒤의 자료를 Rear(또는 Tail)라고 한다. 또한 큐가 꽉 차서 더 이상 큐에 자료를 넣을 수 없는 경우를 Overflow라고 하고, 큐가 비어있어 자료를 더이상 Get(Dequeue)할 수 없는 경우를 Underflow라고 한다. Queue, 어디에 쓸까? 'Queue'는 줄, 대기행렬이라는 뜻을 가지고 있다...

자료구조 : 스택(Stack) 이해하고, 구현하기! C++

Stack 1분만에 이해하기 스택(Stack)은 후입선출 (Last In First Out, LIFO) 자료구조이다.즉, 제일 늦게 들어온 데이터가 제일 빨리 나간다는 것이다.스택에 데이터를 넣는 행동은 Push(밀어 넣는다), 꺼내는 행동은 Pop이라고 부른다.그리고 스택의 가장 위 데이터를 가리키는 포인터를 top 이라고 하겠다. Stack은 어디에 사용되고 있을까?자료구조를 배우면서 나는 항상 "왜 이걸 만들까..."라는 생각이 제일 먼저 들었다.배울때 스택이 유용하고 널리 쓰인다는 걸 알 수 있다면 좋겠다고 생각해서 이 섹션을 덧붙였다! 워드 프로세서를 이용하다가 되돌리기 버튼을 누르면 이전에 했던 명령이 취소된다.이것은 워드 프로세서가 프로그램의 스택에 명령을 하나 하나 추가하다가,사용자가 되돌..

Merge Sort Algorithm (병합 정렬 알고리즘)

앞서 살펴본 Selection Sort(선택 정렬)와 Insertion Sort(삽입 정렬)은입력 리스트의 크기가 크면 클수록 더욱 비 효율적인 단점을 갖고 있다. 그래서 조금 더 나은 정렬법인 Merge Sort를 배워보도록 하겠다.Divide and Conquer Merge Sort에는 Divide and Conquer(나눠서 정복하기)라는 재귀에 기반한 알고리즘 양식이 적용된다.이것은 문제를 원래의 문제와 비슷한 형식으로 자그마하게 쪼개서작은 문제들을 재귀적으로 풀어내는 것이다. Divide(나누기) : 큰 문제를 같은 방식으로 풀 수 있는 작은 문제로 쪼갠다.Conquer(정복) : 작은 문제들을 재귀적으로 풀어낸다.Combine(합치기) : 작은 문제들에서 얻어낸 해결책을 원래의 큰 문제에 적용..

Insertion Sort Algorithm (삽입 정렬 알고리즘)

Insertion Sort(삽입정렬)의 방식은 이렇게 이해하면 쉽다. 내가 트럼프카드를 패로 쥐고 있고, 그게 오름차순으로 정렬되있다고 가정하자. 그러고 새 카드를 뽑으면 정렬된 패의 정렬순서에 맞게 새 카드를 어딘가에 삽입해야한다. 그것이 삽입정렬이다. 도식화 한 Insertion Sort리스트 그림을 통해 삽입정렬의 작동원리를 보자! 0~5번째 위치까지 정렬된 리스트 6번째 위치에 5라는 숫자가 들어왔다. 마지막 위치에 있는 5를 key라고 하자. key는 왼쪽으로 움직이면서 어디에 들어갈지 본다. key가 왼쪽으로 움직이면서 앞자리와 숫자 대소비교를 하게된다. 5번째 자리로간 key는 리스트의 5번째 원소인 13과 값을 비교한다. 이때 key > 13 이므로 5번째 원소의 값 13은 뒤로 밀려난다...

Selection Sort Algorithm (선택 정렬 알고리즘)

정렬(Sorting)은 리스트의 아이템을 오름차순 혹은 내림차순으로 정렬하는 것을 말한다.정렬은 사람, 컴퓨터 모두가 리스트에 있는 아이템을 빨리 찾을 수 있도록 도와준다. Swap정렬을 하기위해서는 swap(자리 바꾸기)을 할 줄 알아야 한다. 123456789101112131415161718192021222324252627namespace Rextester { class Program { public static void Main(string[] args) { int[] array = { 1, 2, 3, 4, 5 }; Console.WriteLine("Before swap()"); printArray(array); Console.WriteLine("After swap()"); swap(array, 0..

Binary Search Algorithm (이진 검색 알고리즘)

Binary Search는 순서대로 정렬된(sorted) 리스트에서 아이템을 찾는데 유용한 알고리즘이다.Binary Search는 아이템이 있는 범위까지 계속해서 반으로 나누면서 찾는다.1부터 10까지 수 중 아무거나 하나를 생각해서 맞추는 게임의 알고리즘과 동일하다. Binary Search의 의사 코드는 다음과 같다. 1. min은 범위 중 가장 낮은 것, max는 범위 중 가장 높은 것이다.min = 1, max = n2. min과 max의 평균값을 구해서 반내림을 한다. 이게 추정치다. (정수가 되도록)3. 만약 숫자를 맞췄다면, stop!4. 만약 추정치가 너무 낮다면 min을 그 추정치보다 높게 변경.5. 만약 추정치가 너무 높다면 max를 그 추..