먼저 코딩 테스트의 중요 알고리즘 중 하나인 정렬에 대해서 알아보자. 정렬이란 말 그대로 데이터를 특정한 기준에 따라서 순서대로 나열하는 것을 의미한다. 프로그램에서 주어진 데이터를 정렬하고 사용하는 경우가 많기 때문에 프로그램을 작성할 때 자주 사용되는 알고리즘 중 하나이다. 또한 정렬 알고리즘이 중요한 이유 중 하나는 이진 탐색의 전처리 과정이기 때문이다. 선택 정렬 (Selection Sort) 란 데이터가 무작위로 나열되어 있을 때, 이 중에서 가장 작은(혹은 가장 큰) 데이터를 가장 앞의 데이터와 바꾸고, 두 번째로 작은 데이터를 두 번째에 위치한 데이터와 계속 바꾸는 방법으로 데이터를 정렬하는 알고리즘이다. 선택 정렬은 가장 원시적인 방법으로 매번 '가장 작은 데이터를 선택한다'는 의미에서 이..
Algorithm
"이것이 취업을 위한 코딩 테스트다 (with 파이썬)" (저자 : 김동빈) 책을 읽고 정리하는 코딩 테스트 내 주요 알고리즘문제 N x M 크기의 직사각형 형태의 미로에 여러 마리의 괴물이 있어 이를 피해 탈출해야 한다. 현재 위치는 (1, 1)이고 미로의 출구는 (N,M)의 위치에 존재하며 한 번에 한 칸씩 이동할 수 있다. 괴물이 있는 부분은 0으로, 괴물이 없는 부분은 1로 표시되어 있다. 미로는 반드시 탈출할 수 있는 형태로 제시된다. 탈출하기 위해 움직여야 하는 최소 칸의 개수를 구하라. 칸을 셀 때는 시작 칸과 마지막 칸을 모두 포함해서 계산한다. 입력 조건) 첫째 줄에 두 정수 N, M(4
문제) N × M 크기의 얼음 틀이 있다. 구멍이 뚫려 있는 부분은 0, 칸막이가 존재하는 부분은 1로 표시된다. 구멍이 뚫려 있는 부분끼리 상, 하, 좌, 우로 붙어 있는 경우 서로 연결되어 있는 것으로 간주한다. 이때 얼음 틀의 모양이 주어졌을 때 생성되는 총 아이스크림의 개수를 구하는 프로그램을 작성하라. 다음의 4 × 5 얼음 틀 예시에서는 아이스크림이 총 3개가 생성된다 입력 조건) 첫 번째 줄에 얼음 틀의 세로 길이 N과 가로 길이 M이 주어진다. (1
BFS 알고리즘은 너비 우선 탐색이라는 의미를 갖고 있다. 말 그대로 가장 가까운 노드부터 탐색해가면서 탐색 범위를 넓혀 나가는 개념이다. DFS는 가장 깊은 노드까지 탐색하고 되돌아가서 다른 경로를 택하는 방법을 취한 것과는 반대로 동작한다는 뜻이다. BFS는 큐를 사용해서 선입선출 (FIFO) 의 방식을 사용한다. 인접 노드를 큐에 삽입하고 먼저 들어온 노드가 먼저 큐에서 나가게 되면서 인접한 노드부터 차례대로 탐색을 할 수 있는 것이다. BFS의 동작과정은 다음과 같다. BFS 동작과정 1. 탐색을 시작하는 노드를 큐에 삽입하고 방문 처리 한다. 2. 큐에서 가장 앞에 있는 노드를 꺼내서 그 노드의 인접 노드 중 방문하지 않은 노드를 모두 큐에 삽입하고 방문 처리 한다. 3. 과정2를 더 이상 반복..
DFS (Depth-First Search)란 깊이 우선 탐색의 약자로 그래프의 탐색(traversal, 순회) 방법 중 하나이다. 이 탐색 알고리즘은 말그대로 특정한 경로로 노드를 탐색하다가 가장 깊은 곳까지 탐색하고 경로를 다시 돌아가 다른 경로로 탐색하는 방식을 보인다. 구체적인 DFS의 동작 과정은 아래와 같다. DFS의 동작과정 1. 탐색을 시작하는 노드를 스택에 삽입하고 방문 처리한다. 2. 스택의 최상단 노드에 인접한 노드가 있을 때 아래와 같은 경우에 나누어서 처리한다. 2-1. 인접 노드 중 방문하지 않은 노드가 존재할 때, 그 노드를 방문하고 스택에 삽입, 방문 처리한다. 2-2. 인접 노드 중 방문하지 않은 노드가 존재하지 않을 때, 스택의 최상단 노드를 꺼낸다. 3. 과정2를 더 이..
그래프의 표현 방식 2번째인 인접 리스트 (adjacency list) 에 대해서 알아보자. 인접 리스트 방식에서는 모든 노드에 연결된 노드에 대한 정보를 차례대로 연결해서 저장한다. 위의 그림과 같이 노드0에 노드1, 노드2, 노드3이 연결되어 있다는 것을 표현했고 같은 방식으로 노드1, 노드2, 노드3에 연결된 노드들을 차례대로 저장하였다. 위의 그림은 C언어에서의 인접 리스트 표현 방식인데 C에서는 배열에 포인터를 넣어서 연결된 노드들을 가리키게 된다. 파이썬에서는 인접 행렬과 동일하게 2차원 리스트로 인접 리스트를 표현할 수 있다. 가중치가 있는 그래프에서의 인접 리스트 표현 방식은 아래와 같다. 위의 그래프를 인접 리스트로 표현하는 소스코드는 아래와 같다. 인접 행렬과 인접 리스트의 차이점은 무..
그래프에서 "인접 (adjacent)하다" 라는 것은 두 vertex를 잇는 edge가 존재한다는 것을 의미한다. 즉, 두 vertex가 연결되어 있다는 뜻이다. 그래프에서 이렇듯 vertex간의 인접함을 나타내는 방식은 크게 2가지가 존재한다. 첫 째로는 인접 행렬 (Adjacency Matrix) 이 있고, 둘 째로는 인접 리스트 (Adjacency List) 가 존재한다. 이 중 인접 행렬에 대해서 다룬다. 인접 행렬이란 2차원 배열에 각 node가 연결된 형태를 저장하는 방법이다. 즉, 인접 행렬에서 [ i ][ j ] 는 vertex i 와 vertex j 간의 연결성을 나타내는 것이다. 이 때 2차원 배열의 [ i ][ j ] 에는 다음과 같은 값들을 저장한다. 1 : (edge에 가중치가 없..
그래프란 자료 구조의 한 종류로 노드 (node) 와 간선 (edge) 으로 표현되는 구조이다. 이 때, 노드를 정점 (vertex) 이라고 부르기도 한다. 아래에 3개의 그래프에 대한 예시를 보자. 이 3개의 그림 모두 그래프를 표현한 것이다. 먼저 G2는 트리 (Tree) 의 형태를 띄고 있다. 따라서 트리 또한 (순환하지 않는) 그래프의 한 종류라는 것을 알 수 있다. G1과 G2에는 화살표가 존재하지 않고, G3에는 화살표가 존재하는 것을 알 수 있다. 이는 undirected graph (무방향 그래프)와 directed graph (유방향 그래프) 의 차이이다. Undirected Graph : 방향이 없는 간선을 가지고 양방향 관계를 나타내는 간선을 가지는 그래프 Directed Graph ..