본문 바로가기

Algorithm/Algorithm

(10)
[Algorithm] 다익스트라 알고리즘 다익스트라 알고리즘이란 ? 음의 가중치가 없는 그래프의 한 정점에서 모든 정점까지의 최단거리를 구하는 알고리즘입니다. 도착 정점 뿐만아니라 모든 다른 정점까지 최단 경로로 방문하며, 각 정점까지의 최단 경로를 모두 찾게 됩니다. 매번 최단 경로로 정점을 선택해 탐색을 반복하는 것 입니다. 음의 간선이 존재하지 않기 때문에 다익스트라는 현실세계에 사용하기 매우 적합한 알고리즘 중 하나입니다. 이 알고리즘은 다이나믹 프로그래밍을 활용하였는데, 그 이유는 '최단 거리는 여러 개의 최단 거리로 이루어져 있기 때문'입니다. 하나의 최단거리를 구할 때 그 이전까지 구했던 최단 거리 정보를 그대로 사용한다는 특징이 있습니다. 동작 과정 1. 출발 노드를 설정합니다. 2. 출발 노드를 기준으로 각 노드의 최소 비용을 ..
[Algorithm] 분할 정복(Divide and Conquer) 분할정복은 큰 문제를 작은 부분 문제로 나눈 후 각각을 해결하고, 이를 통해 전체 문제를 해결하는 알고리즘 기법. 이러한 방식은 컴퓨터 과학 분야에서 널리 사용되며, 대표적인 예로는 퀵정렬, 병합정렬, 이진 탐색 등이 있습니다. 이를 해결하기 위해서는 다음과 같은 세 가지 단계가 필요합니다. 1. 분할(Divide) 문제를 작은 문제 부분으로 나눕니다. 일반적으로 이 과정은 재귀적으로 수행됩니다. 2. 정복(Conquer) 작은 부분 문제를 각각 해결합니다. 부분 문제의 크기가 충분히 작지 않으면 재귀적으로 분할합니다. 3. 결합(Combine) 작은 부분 문제의 해답을 결합하여 원래 문제의 해답을 구합니다. 분할정복의 장점과 한계점 분할정복은 문제의 크기가 커지면 일반적으로 더 빠른 알고리즘으로 복잡도..
[Algorithm] 슬라이딩 윈도우(Sliding Window) 슬라이딩 윈도우(Sliding Window) 슬라이딩 윈도우 알고리즘은 투 포인터와 유사하지만, 부분 배열의 길이를 고정해서 탐색하는 방법 투 포인터와 달리 두 개의 포인터 변수를 사용하지 않고, 고정적인 부분 배열의 크기와 한 개의 포인터 변수를 알고 있다면, 부분 배열의 양끝의 연산으로 정확한 값을 도출해낼 수 있다. [1, 10, 3, 2, 23, 10, 12] 라는 배열이 주어졌을 때 예시 배열 안에서 네 개의 연속된 수열의 최댓값을 찾는다고 가정했을 때, ↓ ↓ [1, 10, 3, 2, 23, 10, 12] sum = 1 + 10 + 3 + 2 ↓ ↓ [1, 10, 3, 2, 23, 10, 12] sum = 10 + 3 + 2 + 23 (1을 빼주고, 23을 더해준 값) ↓ ↓ [1, 10, 3..
[Algorithm] 투 포인터(Two Pointer) 투포인터 알고리즘 투포인터는 두 개의 포인터를 기준으로 검색을 하며, 원하는 값을 찾는 알고리즘입니다. 두 개의 점을 시작점과 끝점으로 이용하게 되면, 데이터의 범위를 표현 가능하며, 메모리와 시간 효율성을 높일 수 있습니다. 사용 예제 1. 특정한 합을 가지는 부분 연속 수열 찾기 부분 연속 수열의 시작점(start)과 끝점(end)의 위치를 기록 특정한 부분합을 M이라 가정할 때 알고리즘은 아래와 같다. 시작점(start)과 끝점(end)이 첫 번째 원소의 인덱스(0)를 가리키도록 한다. 현재 부분합이 M과 같다면 카운트한다. 현재 부분합이 M보다 작으면 끝점(end)를 1 증가시킨다. 현재 부분합이 M보다 크거나 같으면 시작점(start)을 1 증가시킨다. 모든 경우를 확인할 때까지 2번부터 4번 ..
[Algorithm] Big-O 관점에서의 배열과 객체 Big-O 관점에서의 배열과 객체 Object 객체는 정렬되어 있지 않은 key : value 형태의 자료형태이다. Insertion, Removal, Access 모두 상수시간 (O(1)) Searching은 선형 (O(N)) Object.keys, Object.values, Object.entries은 선형 시간 O(N) Object.hasOwnProperty는 상수시간 - O(1) Array 객체와 달리 데이터가 정렬이 되어있다. Access 는 상수시간 (O(1)) 배열의 맨 뒤에 데이터를 추가하는 것은 객체와 같이 상수시간이 소요된다. 하지만 맨 앞에 데이터를 추가하는 경우라면, index를 다시 설정해야하기 때문에 선형시간이 소요된다. 아래는 메소드 별 Big-O push - O(1) pop ..
[Algorithm] Big-O-Notation Big-O Notation 빅오 표기법의 필요성 여러가지 코드를 일반적으로 서로 비교하고 성능을 평가하는 방법. 코드의 성능을 얘기할 때 정확한 전문용어를 사용하는 것이 중요하다. 빅오를 이해하게 되면 문제가 어디서 나타나는지 찾기 쉬울 수 있다. // Code1 function addUpTo(n) { let total = 0; for(let i = 1; i
[Algorithm] 백트래킹(Backtracking) 백트래킹(Backtracking) ? 백트래킹은 '가능한 모든 방법을 탐색한다'는 기본 아이디어에서 나온다. 브루트 포스 알고리즘과의 차이는 브루트 포스의 경우 모든 경우를 전부 시도해보는 방식이라면, 백트래킹의 경우 탐색을 진행하면서, 조건에 맞지 않는 부분을 제외하며 진행하는데에 차이가 있다. DFS는 현재 지점에서 방문할 곳이 있다면, 재귀 호출을 이용하여 계속 이동하게 되는데, 모든 곳을 방문하기 때문에, 목표지점이 있지 않는 경로에 빠져, 비효율적인 결과를 초래할 수 있다. 그래서 이와 같은 비효율적인 경로를 차단하고 목표지점에 갈 수있는 가능성이 있는 루트를 검사하는 방법이 백트래킹 알고리즘이다. 가지치기를 얼마나 잘하느냐에 따라 시간이 많이 단축이 될 수가 있으니, 반복적인 연습을 통해 조건..
[Algorithm] 동적 계획법(Dynamic Programming) # 동적 계획법이란? - 특정 범위까지의 값을 구하기 위해서 그것과 다른 범위까지의 값을 이용하여 효율적으로 값을 구하는 알고리즘 설계 기법이다. - 어떤 문제를 풀기 위해 그 문제를 더 작은 문제의 연장선으로 생각하고, 과거에 구한 해를 활용하는 방식의 알고리즘. # 메모이제이션 (Memoization) - 동일한 계산을 반복해야 할 경우 한 번 계산한 결과를 메모리에 저장해 두었다가 꺼내 씀으로써 중복 계산을 방지할 수 있게 하는 기법이다. 동적 계획법의 핵심이 되는 기술로써 결국 메모리라는 공간 비용을 투입해 계산에 소요되는 시간 비용을 줄이는 방식이다.

728x90