본문 바로가기

TIL/Data Structures and Algorithms

(16)
(자료구조) 배열 1. 배열이란? - 데이터를 나열하고 각 데이터를 인덱스에 대응하도록 구성한 데이터 구조 - 같은 종류의 데이터를 순차적으로 저장 2. 배열의 읽기 - 배열에서 읽기는 딱 한단계다. 특정 인덱스를 통해 한 번에 접근 가능하기 때문이다. - 컴퓨터의 메모리는 셀로 구성된 거대한 컬렉션이라 할 수 있다. 프로그램에서 배열을 선언하면 컴퓨터는 프로그램이 쓸 수 있는 연속된 빈 셀들의 집합을 할당한다. 컴퓨터 메모리 내에 각 셀에는 특정 주소가 있다. 각 셀의 메모리는 앞 셀의 주소에서 1씩 증가한다. - 컴퓨터가 배열의 특정 인덱스에 있는 값을 읽을 때 한 번의 단계로 바로 갈 수 있는 것은 아래와 같은 점들이 복합적으로 작용한다. 컴퓨터는 모든 메모리 주소에 한 번에 갈 수 있다. 각 배열에 저장된 내용은 ..
(자료구조) 스택 1. 스택이란 - 가장 나중에 쌓은 데이터를 가장 먼저 빼낼 수 있는 데이터구조 (LIFO) 2. 스택의 제약 - 데이터는 스택의 끝에만 삽입가능 - 데이터는 스택의 끝에서만 읽을 수 있다. - 데이터는 스택의 끝에서만 삭제할 수 있다. 3. 스택의 활용 - 오래 사용할 데이터를 저장할 때는 일반적으로 스택을 사용하지 않지만 임시 데이터를 다뤄야 하는 알고리즘에서는 스택이 유용한 도구 - 컴퓨터 내부의 프로세스 구조의 함수 동작 방식 4. 스택 예제 - 재귀함수가 대표적인 예제이다. def recursive(data) if data < 0 puts "end" else puts data recursive(data-1) puts "returned #{data}" end end 5. 스택의 장단점 - 장점 :..
(자료구조) 큐(QUEUE) 1. 큐의 구조 - 극장에 줄 서 있는 사람들을 큐처럼 생각할 수 있다. 가장 먼저 줄 선 사람이 가장 먼저 극장에 들어가듯 큐 역시 첫 번째로 추가된 항목이 가장 먼저 제거된다. 이를 First In First Out, 즉 FIFO라 표현한다. - 컴퓨터의 운영체제나 네트워크 구조에서도 많이 쓰이는 자료구조이다. 2. 큐 루비코드 class PrintManager def initialize @queue = [] end def enqueue(data) @queue.push(data) end def dequeue while @queue.any? # 루비의 시프트 메서드는 배열의 첫 번째 원소를 삭제 후 반환 data = @queue.shift puts data end end end 3. 큐가 자주 쓰이는 ..
(알고리즘) 최단경로 알고리즘 - 다익스트라 알고리즘 다익스트라 알고리즘 파이썬 구현 (우선순위 큐 활용까지 포함) 참고: heapq 라이브러리 활용을 통해 우선순위 큐 사용하기 데이터가 리스트 형태일 경우, 0번 인덱스를 우선순위로 인지, 우선순위가 낮은 순서대로 pop 할 수 있음 우선순위큐는 최소힙 방식을 활용한다. 즉 pop할때마다 제일 최소값이 나온다. import heapq queue = [] heapq.heappush(queue, [2, 'A']) heapq.heappush(queue, [5, 'B']) heapq.heappush(queue, [1, 'C']) heapq.heappush(queue, [7, 'D']) print (queue) for index in range(len(queue)): print (heapq.heappop(queue..
(알고리즘) 탐욕 알고리즘 1. 탐욕 알고리즘 이란? Greedy algorithm 또는 탐욕 알고리즘 이라고 불리움 최적의 해에 가까운 값을 구하기 위해 사용됨 여러 경우 중 하나를 결정해야할 때마다, 매순간 최적이라고 생각되는 경우를 선택하는 방식으로 진행해서, 최종적인 값을 구하는 방식 2. 탐욕 알고리즘 예 문제1: 동전 문제 지불해야 하는 값이 4720원 일 때 1원 50원 100원, 500원 동전으로 동전의 수가 가장 적게 지불하시오. 가장 큰 동전부터 최대한 지불해야 하는 값을 채우는 방식으로 구현 가능 탐욕 알고리즘으로 매순간 최적이라고 생각되는 경우를 선택하면 됨 coin_list = [500, 100, 50, 1] def min_coin_count(value, coin_list): total_coin_count ..
(알고리즘) 깊이우선탐색 (DFS) 1. 파이썬으로 그래프를 표현하는 방법 파이썬에서 제공하는 딕셔너리와 리스트 자료 구조를 활용해서 그래프를 표현할 수 있음 graph = dict() graph['A'] = ['B', 'C'] graph['B'] = ['A', 'D'] graph['C'] = ['A', 'G', 'H', 'I'] graph['D'] = ['B', 'E', 'F'] graph['E'] = ['D'] graph['F'] = ['D'] graph['G'] = ['C'] graph['H'] = ['C'] graph['I'] = ['C', 'J'] graph['J'] = ['I'] 3. DFS 알고리즘 구현 자료구조 스택과 큐를 활용함 need_visit 스택과 visited 큐, 두 개의 자료 구조를 생성 BFS 자료구조는 두 ..
(알고리즘) 너비우선탐색 (BFS) 1. BFS 와 DFS 란? 대표적인 그래프 탐색 알고리즘 너비 우선 탐색 (Breadth First Search): 정점들과 같은 레벨에 있는 노드들 (형제 노드들)을 먼저 탐색하는 방식 깊이 우선 탐색 (Depth First Search): 정점의 자식들을 먼저 탐색하는 방식 BFS/DFS 방식 이해를 위한 예제 BFS 방식: A - B - C - D - G - H - I - E - F - J 한 단계씩 내려가면서, 해당 노드와 같은 레벨에 있는 노드들 (형제 노드들)을 먼저 순회함 DFS 방식: A - B - D - E - F - C - G - H - I - J 한 노드의 자식을 타고 끝까지 순회한 후, 다시 돌아와서 다른 형제들의 자식을 타고 내려가며 순화함 2. 파이썬으로 그래프를 표현하는 방법..
(알고리즘) 그래프 이해 1. 그래프 (Graph) 란? 그래프는 실제 세계의 현상이나 사물을 정점(Vertex) 또는 노드(Node) 와 간선(Edge)로 표현하기 위해 사용예제 집에서 회사로 가는 경로를 그래프로 표현한 예 2. 그래프 (Graph) 관련 용어 노드 (Node): 위치를 말함, 정점(Vertex)라고도 함 간선 (Edge): 위치 간의 관계를 표시한 선으로 노드를 연결한 선이라고 보면 됨 (link 또는 branch 라고도 함) 인접 정점 (Adjacent Vertex) : 간선으로 직접 연결된 정점(또는 노드) 참고 용어 정점의 차수 (Degree): 무방향 그래프에서 하나의 정점에 인접한 정점의 수 진입 차수 (In-Degree): 방향 그래프에서 외부에서 오는 간선의 수 진출 차수 (Out-Degree)..
(알고리즘) 이진탐색 이진 탐색 (Binary Search) 이란? 탐색할 자료를 둘로 나누어 해당 데이터가 있을만한 곳을 탐색하는 방법 [저작자] by penjee.com 이미지 출처 2. 분할 정복 알고리즘과 이진 탐색 분할 정복 알고리즘 (Divide and Conquer) Divide: 문제를 하나 또는 둘 이상으로 나눈다. Conquer: 나눠진 문제가 충분히 작고, 해결이 가능하다면 해결하고, 그렇지 않다면 다시 나눈다. 이진 탐색 Divide: 리스트를 두 개의 서브 리스트로 나눈다. Comquer 검색할 숫자 (search) > 중간값 이면, 뒷 부분의 서브 리스트에서 검색할 숫자를 찾는다. 검색할 숫자 (search) < 중간값 이면, 앞 부분의 서브 리스트에서 검색할 숫자를 찾는다. 3. 어떻게 코드로 만들..
(알고리즘) 동적계획법 1. 정의 동적계획법 (DP 라고 많이 부름) 입력 크기가 작은 부분 문제들을 해결한 후, 해당 부분 문제의 해를 활용해서, 보다 큰 크기의 부분 문제를 해결, 최종적으로 전체 문제를 해결하는 알고리즘 상향식 접근법으로, 가장 최하위 해답을 구한 후, 이를 저장하고, 해당 결과값을 이용해서 상위 문제를 풀어가는 방식 Memoization 기법을 사용함 Memoization (메모이제이션) 이란: 프로그램 실행 시 이전에 계산한 값을 저장하여, 다시 계산하지 않도록 하여 전체 실행 속도를 빠르게 하는 기술 문제를 잘게 쪼갤 때, 부분 문제는 중복되어, 재활용됨 예: 피보나치 수열 분할 정복 문제를 나눌 수 없을 때까지 나누어서 각각을 풀면서 다시 합병하여 문제의 답을 얻는 알고리즘 하양식 접근법으로, 상위..