목록알고리즘 (20)
천천히 빛나는
참고 영상 : https://youtu.be/7C9RgOcvkvo?si=PuM-7RIBWbVPtYTw bfs와 dfs는 탐색 알고리즘이다. 내가 헷갈렸던 부분이 있는데 그래프를 인접 행렬, 인접 리스트로 표현할 수 있다고 배웠는데 bfs, dfs는 각각 큐랑 스택을 사용하여 구현한다는 점이었다. bfs와 dfs는 그래프를 탐색하는 알고리즘인 것이다. 그래프를 표현하는 방식이 아니다! https://shine-slowly.tistory.com/39 알고리즘 : 자료구조(1) 스택 (Stack) (C++로 구현) 스택 (Stack) 스택(stack)은 쌓아놓은 더미라는 의미 그대로, 책상에 쌓여있는 책을 생각하면 된다. 가장 큰 특징은 LIFO(Last In First Out-후입선출)이다. 제일 최근에 들..
그래프의 표현 그래프를 컴퓨터가 처리하게 만들기 위해서는 그래프를 적절한 자료구조로 변환해 주어야 한다. 표현 방식에는 인접행렬(adjaceny matrix)와 인접리스트(adjaceny list)가 있다. 인접 행렬 그래프 (adjaceny matrix) 모든 정보를 저장하는 방식이다. 직관적이며 쉽게 구현이 가능하지만 불필요한 정보 저장이 많다. 그래프의 크기가 커지면 메모리 초과가 발생할 수도 있다. 보통 2차원 배열을 사용하여 구현한다. 정점의 개수가 총 n개이면 인접행렬은 nxn의 크기를 갖는다. 무방향 그래픠 경우 대각선을 중심으로 대칭이며 가중치가 있을 경우 1이 아닌 가중치를 저장하게 된다. 인접 리스트 그래프 (adjaceny list) 갈 수 있는 곳만 저장하는 방식이다. 필요한 정보만..
본 포스팅에서는 그래프의 기본 용어만 다룹니다. 인접행렬 및 인접리스트 관련 내용을 원한다면 (2)를 읽어주세요. 그래프(Graph) 정점(Node/Vertex, 노드)과 간선(Edge, 엣지)으로 이루어진 자료구조이다. 정점의 집합을 V, 간선의 집합을 E, 그래프를 G라고 했을 때 G=(V, E)라고 할 수 있다. 정점 A에서 B로 이동할 수 있는 방법을 경로(Path)라고 한다. 그래프 내에서 정점끼리의 path는 여러 개여도 된다. 또 두 정점 간 경로가 존재하지 않을 수도 있다. 정점 A에서 B로 가는 Path가 존재하면 정점 B는 정점 A로부터 reachable하다고 한다. 노드가 겹치지 않는 경로를 elementary하다고 하며 길이(length)는 엣지의 수를 나타낸다. 간선으로 연결되어 ..
리스트 (List) List는 배열과 비교하여 이와 같은 모습을 띄고 있다. 실제 값이 저장되는 데이터 필드과 주소가 저장된 링크 필드로 구현되어 있다. 리스트는 삽입, 삭제, 탐색에서 뚜렷한 차이를 보인다. 배열을 생각해보면 값을 삭제하려면 뒤에 있던 값들을 이동시켜야 한다. 하지만 리스트는 주소만 바꿔주면 된다. https://velog.io/@kon6443/Data-Structure-C-%EC%9E%90%EB%A3%8C%EA%B5%AC%EC%A1%B0-Linked-list [Data Structure] C++ / 자료구조 / Linked list 링크드 리스트란 배열과 비슷하게 선형적으로 연결된 자료구조이다.하지만 인접한 메모리 공간에 저장되는 배열과 다르게 링크드 리스트는 인접한 메모리 공간에 저..
스택 : 한쪽에서만 자료를 빼고 넣을 수 있다. 큐 : Front 에는 삭제가, Back 에서는 삽입이 일어난다. 덱 (Deque) 덱(deque)은 양쪽에서 삽입과 삭제가 가능하며 스택(stack)과 큐(queue)의 연산을 모두 지원한다. Double-Ended Queue라는 뜻으로 front, rear에서 모두 삽입 삭제가 가능한 큐를 생각하면 된다. enqueue : 덱에서 요소를 추가 dequeue : 덱에서 요소를 삭제 front : 덱의 맨 앞 rear : 덱의 맨 뒤 큐와 같은 용어를 쓴다. 하지만 enqueue와 dequeue가 앞과 뒤 모두에서 일어난다는 것을 잊지밀자! class Deque { private: int front; // front에 가까운 원소의 바로 앞 int rear..
큐 (Queue) 큐(queue)는 스택(stack)과 다르게 FIFO(First In First Out-선입선출)의 구조를 가지고 있다. 편의점 아르바이트를 해보신 분들은 특히 잘 아시겠지만 가장 먼저 들어온 것을 가장 앞에 배치하여 가장 먼저 나갈 수 있도록 하는 것이다. 은행의 번호표를 생각해보자. 100번째 번호표를 뽑은 상태이고 현재 손님이 많이 몰린 탓이 96번째 손님까지 서비스를 받고 있다. 그렇다면 다음 손님의 번호와 새로온 손님의 번호를 기억하기 위해서는 어떻게 해야할까? 바로 큐를 이용하면 된다. Enqueue : 큐 맨 뒤에 요소 추가 Dequeue : 큐 맨 앞에 요소 삭제 Peek : front에 위치한 데이터 (가장 일찍 들어온 요소) Front : 맨 앞의 위치 Rear : 맨..
스택 (Stack) 스택(stack)은 쌓아놓은 더미라는 의미 그대로, 책상에 쌓여있는 책을 생각하면 된다. 가장 큰 특징은 LIFO(Last In First Out-후입선출)이다. 제일 최근에 들어온 데이터가 가장 먼저 나가는 것이다. 편의점 아르바이트를 해보신 분들이 아는 선입선출과 반대되는 용어이다. 여기서 선입선출에 해당되는 자료구조는, 뒤에서 다룰 큐 (Queue)이다. 문서 편집기에서 되돌리기를 했을 때 바로 직전에 실행한 작업이 취소되는 것을 생각하면 된다. push : 스택의 top에서 데이터 삽입 pop : 스택의 top에서 데이터 삭제 stack top : 스택에서 입출력이 이루어지는 부분 element : 스택에 저장되는 것 full stack : 포화 상태의 스택 스택의 기본 용어는..
정렬 알고리즘이란? 불규칙한 데이터들을 정렬해야 할 때, 상황에 맞는 알고리즘을 사용하여 문제를 해결할 수 있다. 예를 들어, 특정 숫자를 찾아야 할 때 정렬된 데이터들 속에서 찾는 것과 정렬되지 않은 데이터들에서 찾는 것은 차이가 발생한다. (이진탐색을 사용할 수 있고 없고가 결정됨) 정렬 알고리즘들을 비교하기 위해 Big O 표기법을 사용하여 시간복잡도를 나타낼 것이므로 시간복잡도에 대한 지식이 아예 없다면 아래 짧은 포스팅을 읽고 오는 것을 추천한다. https://shine-slowly.tistory.com/33 알고리즘: 시간 복잡도란 본격적으로 시간복잡도 문제를 풀기 전에, 시간 복잡도에 대해 설명하도록 하겠다. 이 설명은 시간복잡도를 들어는 봤으나 정확히 개념을 모르겠거나 까먹은 전공자들이 ..
브루트 포스(Brute Force)란? Brute : 무식한 + Force : 힘 가능한 모든 경우의 수를 탐색하면서 요구조건에 충족하는 결과를 가져온다 전체를 탐색하기 때문에 전체 탐색, 완전 탐색이라고도 한다. 브루트 포스 알고리즘은 해가 하나 이상 존재한다는 가정 하에 모든 범위를 탐색하므로 100% 정답을 찾을 수 있다 알고리즘을 설계하고 구현하는 것이 매우 쉽지만 실행 시간이 매우 오래 걸리며 메모리 측면에서 비효율적이다. 브루트 포스는 선형 구조와 비선형 구조로 나뉜다 - 선형 구조 : 순차 탬색 - 비선형 구조 : 너비 우선 탐색 (BFS), 깊이 우선 탐색 (DFS), 백트래킹 브루트 포스 예시 1. 5자리 비밀번호 자물쇠를 00000부터 99999까지 대입해서 자물쇠를 풀 수 있다. 2...
본격적으로 시간복잡도 문제를 풀기 전에, 시간 복잡도에 대해 설명하도록 하겠다. 이 설명은 시간복잡도를 들어는 봤으나 정확히 개념을 모르겠거나 까먹은 전공자들이 읽어야 이해가 될 것이다. 시간 복잡도란? 코드를 실행해보기 전에 반복문, 입력값 등을 통해서 실행시간이 얼마나 걸릴지 추측할 수 있는 척도 보통 Big-O 표기법으로 최악의 상황일 때 걸리는 시간을 이용해서 나타낸다. x축은 자료의 수, y축은 걸리는 시간이다. 즉 빨간 부분에 있을 수록 수행 시간이 굉장히 오래 걸리는 알고리즘이다 1) O(1) cout