CS Engineering./ALGORITHM 7

쓰이는 알고리즘 - 우선순위 큐(Heap)의 임의 요소 삭제에 관한 Idea

우선순위 큐는 반드시 Heap으로 구현할 필요는 없지만, 최소 혹은 최대값에 focus를 두는 우선순위 큐의 특성 상 일반적으로 그 장점을 최대한 잘 살릴 수 있는 Heap을 이용하여 구현한다. 하지만 Heap을 이용하여 우선순위 큐를 구현하게 되면 임의의 요소를 삭제하는 case를 처리하기 곤란해진다. 본 포스팅에선 이런 상황에서 도움이 될만한 idea를 소개하고자 한다. Solution 1. 카운팅 우선순위 큐의 요소에 대한 chk 배열을 만들어 삭제된 요소에 대해 카운팅을 하고, poll할 때 chk 배열의 값을 확인하는 방법이다. 위 그림에서 7 요소를 삭제하고 싶다면 chk[7]++ 이런 식으로 카운팅을 하고, poll할 때 chk배열의 값을 확인하여 1 이상이면 삭제된 것으로 간주한다. 하지만..

쓰이는 알고리즘 - 그래프 기초(최소신장트리)

1. 최소신장트리(Minimum Spanning Tree)의 이해 "신장트리"(이하 Spanning Tree)란, 1. 그래프의 형태를 취하면서, 2. 모든 노드들이 연결되어 있고, 3. 트리의 조건을 충족하여 사이클이 존재하지 않는 자료구조이다. 아래의 그림은 일반적인 그래프(좌)와 신장트리(우)의 예를 나타내고 있다. 앞서 Spanning Tree는 모든 노드들이 연결되어 있고, 사이클을 갖지않는 그래프라고 언급했는데, 그 중 모든 간선(edge) value의 합이 최소를 띄는 Spanning Tree가 MST(최소신장트리)이다. 간선의 가중치가 존재하는 그래프에서 MST를 찾는 과정(알고리즘)의 대표적인 예가 크루스칼 알고리즘(Kruskal's algorithm)과 프림 알고리즘(Prim's alg..

쓰이는 알고리즘 - 그래프 알고리즘 기초(BFS, DFS, 최단경로 알고리즘, 백트래킹)

알고리즘에서 그래프는 실제 세계의 현상이나 사물을 정점, 노드, 간선으로 표현하여 나타내기 쉽다. 따라서 경로, 방법 탐색 등의 각종 문제 해결의 상황에서 자주 활용된다. 본 포스팅에서는 그래프와 관련된 기초 용어는 다루지 않으니 궁금한 사람은 구박사님(=구글링)께 물어보도록 하고, 그래프 공부를 하며 정리하는 과정에서 얻은 insight를 공유하고자 한다. 1. BFS(너비 우선 탐색 = 형제 우선) - 정점들과 같은 레벨에 있는 노드들을 먼저 탐색하는 방식 - 그래프를 나타내기 위해 각 노드를 Key, 그리고 각 key와 간선으로 연결된 노드를 관리하는 list를 value로 가지는 map활용 - 앞으로 방문할 노드를 관리하는 큐(need_visit), 방문했던 노드를 관리하는 큐(visited), ..

쓰이는 알고리즘 - Recursive Call (재귀 호출) 언제 쓸까?

1. 재귀 호출이란? - 함수 안에서 동일한 함수를 호출하는 형태 - 어떤 상황에서 하나의 큰 문제가 여러 개의 같은 작은 문제로 분할(분할 정복)하여 해결가능한 경우 사용됨 - function(n)의 결과 값에 function(n-1)이 포함된 경우 - 동일한 process를 쪼개고 쪼개다 보면 멈춰지는 지점이 있음 (러시아 인형이랄까.. 인형안에 인형. 인형안에 인형...) 2. 재귀 호출의 패턴 public int function(arg){ if (arg > n){ return function(arg-1); } else{ return m; } } public int function(arg){ if (arg

쓰이는 자료구조 - Tree, Heap (Hash와 Tree의 성능비교 포함)

1. Tree가 뭐에요? - Node(이파리)와 Branch(가지)를 이용해서 원형 사이클 관계를 이루지 않도록 계층적(나무와 닮음)으로 구성한 데이터 구조 - 대표적으로 이진 트리의 구조로 자료 탐색 알고리즘 구현을 위해 사용되어진다. - Node: 트리에서 데이터를 저장하는 구성 요소 - Branch: 트리와 트리를 연결하는 요소. 결국 하나의 Node에는 data와 다음 Node에 대한 link값을 가진다. - Root Node: 최상위 노드 - Terminal Node(Leaf Node): Child Node가 하나도 없는 노드 - Sibling: 동일한 Parent Node를 가진 노드 - Level: 트리의 층 수 - Depth: 트리에서 Node가 가질 수 있는 최대 Level - Sibli..

쓰이는 자료구조 - Hash Table

1. 왜, 해시 테이블인가? - 해시: 어떤 값을 고정된 길이로 변환하는 것 - 해싱 함수(Hashing Function): Key에 대해 산술 연산(고정된 길이로 변환)을 수행하여 데이터 위치를 찾을 수 있는 값을 출력하는 함수 - 해시 값(=해시 주소): Key를 해싱 함수로 연산하여 얻은 값. 이를 기반으로 해시 테이블에서 Key에 대한 데이터 위치를 찾을 수 있다. - 해시 테이블: K(=Key, 키)에 V(=Value, 데이터)를 저장하는 데이터 구조 -> 빠른 검색을 할 수 있다. 그 과정을 예로 들어볼까. 실제로는 복잡하겠지만, 이해를 위해 간단하게 예를 들어보겠다. - 해싱 함수: K % 8 - 해시 테이블 크기: 8 (8개의 데이터를 저장할 수 있는 공간) 전화번호부가 있다. 총 8명의 ..

쓰이는 자료구조 - Array, Stack, Queue

모든 학문이 그렇듯, CS(Computer Science)역시 base가 잘 잡혀있어야 그를 기반으로 응용해나갈 수 있다. 백엔드 개발을 예로 들어볼까. 유저(클라이언트)를 대상으로 어떤 서비스를 제공하는 시스템을 개발하고 싶다. 그러기 위해선, 시스템을 구축하기 위한 Framework 기술을 알아야하고, 이를 배포 및 운영할 수 있는 Server 지식도 알아야하며, 데이터 관리를 위한 기술도 알아야한다. 그 중에서 가장 중요한 내용은 뭘까. 우리의 목표는 고객을 대상으로 "서비스"를 제공하는 것이라 했는데, 앞서 말했던 정보들은 서비스를 제공하기 위한 "수단"으로써 필요한 내용들이다. 본질은 "서비스"이다. 이 서비스를 비지니스 로직에 따라 처리될 수 있도록 구현하는 능력. 이는 자료구조 및 알고리즘에..