본문 바로가기

전체 글540

[Algorithm] 다익스트라 (Dijkstra) 다익스트라(Dijkstra) 알고리즘 다익스트라 알고리즘은 다이나믹 프로그래밍을 활용한 대표적인 최단 경로 탐색 알고리즘이다. 인공위성 GPS 소프트웨어 등에서 가장 많이 사용되는 알고리즘이다. 다익스트라 알고리즘은 특정한 하나의 정점에서 다른 모든 정점으로 가는 최단 경로를 계산한다. 이때, 거리가 음수인 간선은 포함할 수 없다. 하지만, 현실 세계에서는 거리가 음수인 경로는 존재하지 않아서 다익스트라는 현실 세계에 적용하기 매우 적합한 알고리즘 중 하나이다. 기본적으로 그리디 알고리즘을 바탕으로 하고 있다. 거리를 기록하며 이미 최단 경로를 구한 곳은 다시 구할 필요가 없기 때문에 다이나믹 프로그래밍으로 보기도 한다. 항상 최단 경로를 찾고 탐욕적으로 선택한다. - 그리디 이미 계산된 경로를 저장후,.. 2023. 3. 13.
[Algorithm] 동적 계획법 (DP. Dynamic Programming) 동적 계획법 (DP. Dynamic Programming) 동적 계획법이란 하나의 복잡한 문제를 여러 개의 간단한 하위 문제로 나누어 푼 다음, 이를 결합하여 답을 도출해내는 방법이다. 나누어진 하위 문제들의 결과를 따로 저장해두었다가 이후 동일한 문제가 나왔을 시 저장해둔 결과를 가져다가 쓰면 같은 문제를 반복해서 풀지 않아도 되기 때문에 문제를 해결하는데 시간을 절약할 수 있다. 즉 한번 푼 하위 문제는 중복해서 풀지 않는다. 그렇다면 어떤 문제인 경우에 동적 계획법으로 해결할 수 있을까? 우선 문제를 나누어봤을 때 반복되는 작은 문제들이 나와야 되고, 전체 문제의 최적해가 부분 문제의 최적해들로 구성되는지 확인해야 된다. 이 두 가지 조건 모두 충족한다면 동적 계획법으로 풀 수 있는 문제다. 동적 .. 2023. 3. 13.
[Algorithm] 최소 공통 조상 (LCA. Lowest Common Ancestor) 최소 공통 조상 (LCA. Lowest Common Ancestor) → 두 정점이 만나는 최초 부모 정점을 찾는 것 트리 형식이 아래와 같이 주어졌다고 하자 4와 5의 LCA는? → 4와 5의 첫 부모 정점은 '2' 4와 6의 LCA는? → 첫 부모 정점은 root인 '1' 찾는 법 해당 정점의 depth와 parent를 저장해두는 방식이다. 현재 그림에서의 depth는 아래와 같을 것이다. [depth : 정점] 0 → 1(root 정점) 1 → 2, 3 2 → 4, 5, 6, 7 parent는 정점마다 가지는 부모 정점을 저장해둔다. 위의 예시에서 저장된 parent 배열은 아래와 같다. // 1 ~ 7번 정점 (root는 부모가 없기 때문에 0) const parent[] = {0, 1, 1, 2.. 2023. 3. 13.
[Algorithm] 최장 증가 수열 (LIS. Longest Increasing Sequence) LIS (Longest Increasing Sebsequence) 최장 증가수열 문제는 어떤 배열에서 특정 부분을 지워 만들 수 있는 증가 부분수열 중 가장 긴 수열을 구하는 문제다. 배열이 [1, 4, 4, 6, 8, 3]이면 증가부분수열은 [1, 4, 6, 8], [4, 6, 8], [4, 8], [6, 8]이다. 여기서 가장 긴 증가 부분수열은 [1, 4, 6, 8]이다.가장 쉬운 방법은 모든 증가부분수열을 구해 가장 긴 것을 찾는 것이지만, 같은 연산을 반복하기 때문에 O(2^n)의 시간복잡도를 가진다. 이 문제를 효율적으로 해결하는 두 가지 방법이 있다. Ex) 배열 (1, 5, 4, 2, 3, 8, 6, 7, 9, 3, 4, 5) 에서 부분 수열 (1, 2, 3, 6, 7, 9) 는 전체 수열.. 2023. 3. 13.
[Programmers] Lv 2. 줄 서는 방법 https://school.programmers.co.kr/learn/courses/30/lessons/12936 프로그래머스 코드 중심의 개발자 채용. 스택 기반의 포지션 매칭. 프로그래머스의 개발자 맞춤형 프로필을 등록하고, 나와 기술 궁합이 잘 맞는 기업들을 매칭 받으세요. programmers.co.kr function solution(n, k) { const [arr, result, dp] = [ Array.from({ length: n }, (_, i) => i + 1), [], [1, 1, 2], ]; const factorial = (n) => { if (dp[n] !== undefined) return dp[n]; return (dp[n] = n * factorial(n - 1)); };.. 2023. 3. 12.
[Daily Scrum] Meet 06. 2023-03-11 토요일 아파서 불참 2023. 3. 12.
[Daily Scrum] Meet 05. 2023-03-10 금요일 아파서 불참 2023. 3. 12.
[Daily Scrum] Meet 04. 2023-03-09 목요일 시간 : 22:00 ~ 22:40 진행 내용 : Todo list 공유, 내일 학습 계획 공유, 팀원간 소통 개인 학습 내용 : 프로그래머스 2문제(Lv. 2) 풀이 분할 정복, 이진 탐색 학습 2023. 3. 9.
[Algorithm] 선형 탐색, 분할 정복, 이진 탐색(Binary Search) 선형 탐색, 순차 탐색 (Linear Search, Sequential Search) 정렬된 배열 안에서 특정 원소를 찾기 위해 인덱스 0부터 차례로 탐색 원소를 건너뛰는 일 없이 순차적으로 탐색 선형 탐색을 이용해 O(n)의 시간복잡도로 구현할 수 있다. const arr = [1, 2, 3, 4, 5, 6]; const linearSearch = (sortedIntArray, value) => { for (let i = 0; i < arr.length; i++){ if (arr[i] === value) return i; } return -1; } console.log(linearSearch(arr, 3)); // 2 console.log(linearSearch(arr, 5)); // 4 console.. 2023. 3. 9.
[Programmers] (2018 KAKAO BLIND RECRUITMENT) Lv 2. [3차] 방금그곡 https://school.programmers.co.kr/learn/courses/30/lessons/17683 프로그래머스 코드 중심의 개발자 채용. 스택 기반의 포지션 매칭. 프로그래머스의 개발자 맞춤형 프로필을 등록하고, 나와 기술 궁합이 잘 맞는 기업들을 매칭 받으세요. programmers.co.kr function solution(m, musicinfos) { m = m.replaceAll('C#', 'c').replaceAll('D#', 'd').replaceAll('F#', 'f').replaceAll('G#', 'g').replaceAll('A#', 'a'); return musicinfos.reduce((acc, data) => { const [start, end, TITLE, tem.. 2023. 3. 9.