본문 바로가기

Algorithm65

[Algorithm] 동적 프로그래밍 LIS 문제 (Memoization VS Tabulation) LIS(Longest Increasing Subsequence)는 엄격하게 오름차순으로 정렬된 가장 긴 부분 배열을 반환합니다. 부분 배열(Subsequence)는 데이터의 순서가 유지되는 모든 부분 배열을 의미합니다. 반면 substring 혹은 subarray는 연속된 부분 배열을 의미합니다. 예를 들어 'abc' 문자열이 주어진 경우 substring과 subsequence는 다음과 같습니다. arr='abc'; substring = 'a','b','c','ab','bc', 'abc'; subsquence = 'a','b','c','ab','ac','bc','abc'; 주어진 배열에서 subsequnce를 구하기 위해서 동적 프로그래밍(Dynamic Programming) Memoization과 T.. 2022. 7. 13.
[Algorithm] 힙 정렬(Heap Sort) 구현하기 Node.js/Javascript 힙 정렬(Heap Sort)은 최대 힙 / 최소 힙을 구현한 후 정렬을 진행하는 방식입니다. 힙 정렬은 1964년 J.W.J 윌리엄스에 의해 발명됩니다. 힙 정렬의 시간복잡도는 먼저 최소 힙/최대 힙을 구현해야 O(log N)이 소요되고, 구성된 힙 트리에서 정렬을 구현하는데 N 번의 연산이 필요하므로 총 O(N log N)이 필요합니다. 힙 정렬 알고리즘 힙 정렬 알고리즘 순서는 다음과 같습니다. 주어진 배열을 통해 최소 힙/ 최대 힙을 구현합니다. 루트의 값과 자식 노드의 값을 비교하면서 값을 출력합니다. 최소 힙/ 최대 힙의 길이가 0이 될 때 까지 위 과정을 반복합니다. 예를 들어 arr=[5, 4, 3, 2, 1]이 주어집니다. 최소 힙을 구하면 다음과 같습니다. 최소 힙을 기반으로 정렬을 진행.. 2022. 7. 5.
[Algorithm] 최대 이진 힙 구현하기 Node.js/Javascript 자료구조 중 이진 힙(Binary Heap)은 노드 값들이 순서를 가지고 있는 완전 이진 트리(Complete Binary Tree)로 구성됩니다. 완전 이진 트리는 마지막 레벨을 제외한 모든 레벨의 노드들이 가득 채워져 있는 형태입니다. 마지막 레벨의 경우 왼쪽 부터 차례 대로 채워져 있게 됩니다. 이진 힙은 최대 힙(Max Heap), 최소 힙(Min Heap)으로 구분됩니다. 만약 부모 노드의 값이 자식 노드의 값보다 큰 경우는 최대 힙, 작은 경우는 최소 힙이 됩니다. 완전 이진 트리의 경우 노드가 낮은 레벨 부터 채워집니다. 또한 같은 레벨에서는 왼쪽 부터 채워지는 특징을 가집니다. 이런 특성 때문에 배열로 구현하는게 수월합니다. 이진 힙의 경우 자식 노드가 2개인 트리 구조로 구성되어 있으므로.. 2022. 7. 4.
[Algorithm] Gossip Protocol 알고리즘 문제 Node.js gossip Protocol이란 전염병 프로토콜로도 불립니다. 특정 지점에서 전염병이 발생 될 경우 전체 매트릭스 구간에 바이러스가 확산되는 방식을 기반으로 한 P2P 통신 프로세스입니다. 분산 시스템에서는 그룹 내 모든 참여자들에게 프로토콜이 전달되도록 Gossip Protocol 알고리즘을 사용합니다. 문제 세로,가로 길이가 각각 M,N인 마을이 배열로 주어집니다. '1'은 주민이 살고 있는 좌표를 의미하고, '0'은 주민이 없는 좌표를 의미합니다. 마을에 소문이 퍼지기 시작하면 상하좌우 방향으로 하루에 1칸씩 퍼지게 됩니다. 특정 좌표의 집에서 소문이 시작되어 마을 저체에 소문이 퍼지기 따지 걸리는 시간(day)을 반환하세요. 입/출력 입력 1 : Village string 타입을 요소로 가지는 배.. 2022. 6. 30.
[Algorithm] 기수 정렬 계수 정렬 Node.js 문제 정수를 요소로 가지는 배열을 입력받아 오름차순으로 정렬된 값을 반환해야 합니다. 입/출력 입력값 arr Number 타입 요소를 가진 배열 arr[i] >= 0 arr.length { if(item > max) return item; return max; }, 0); } 기수 정렬 내부적으로는 계수 정렬(Counting Sort)를 돌립니다. 기수 테이블 만큼의 새로운 테이블을 생성하고, count의 누적개수를 갱신하여 전체 배열을 반대로 순회하면서 특정 기수에서 정렬을 진행합니다. const countingSort = (arr, radix) => { const N = arr.length; const output = Array(N).fill(0); const count = Array(10).fill.. 2022. 6. 29.
[Algorithm] 최단거리 알고리즘 문제 Node.js 문제 세로/가로 길이가 각각 M,N인 room의 지도가 2차원 배열로 주어집니다. room의 지도 중 1은 장애물이고, 0은 이동 가능한 경로를 의미합니다. 로봇은 지도 위를 1분에 한칸씩 이동할 수 있게 됩니다. 로봇의 현재 위치와 목표 지점이 주어질 경우 이동하는데 최소시간을 반환해야 합니다. 입/출력 입력 1 room 배열을 요소로 가지는 배열입니다. room.length = M room[i]는 Number 타입 room[i].length = N room[i][j]는 세로 i, 가로 j인 지점의 좌표입니다. room[i][j]는 0 또는 1입니다. 입력 2 : src Number 타입 배열 src.length = 2 src[i] >= 0 src는 차례대로 x,y 좌표를 의미합니다. 입력 3 : ds.. 2022. 6. 29.
[Algorithm] 두 배열에서 k 번째 수 찾기 Javascript(getItemFromTwoSortedArrays 알고리즘) 문제 길이가 m, n이고 오름차순으로 정렬되어 있는 두개의 배열이 주어진다. 각 배열은 자연수로 이루어져 있고, 두 배열을 합친 전체 배열에서 k 번째 요소를 출력한다. 입력 자연수를 요소로 가지는 배열 arr1 arr1.length는 m 자연수를 요소로 가지는 배열 arr2 arr2.length는 n k number 타입의 0 이상 정수 출력 nubmer 타입 주의사항 두 배열의 합은 1,000,000 이하 입출력 예시 let arr1 = [1, 4, 8, 10]; let arr2 = [2, 3, 5, 9]; let result = getItemFromTwoSortedArrays(arr1, arr2, 6); console.log(result); // --> 8 arr1 = [1, 1, 2, 10]; a.. 2022. 6. 18.
[Algorithm] Balance Brackets in JS ( 스택(stack) 알고리즘 활용 ) 스택(Stack) 자료구조를 활용한 Bracket Balance 알고리즘 문제입니다. 알고리즘 문제를 해결할 때 어떤 부분이 가장 중요하다고 생각하나요? 문제를 접하고 어떤 알고리즘이 가장 적합한지 생각한 후 풀이를 확인하시면 실력이 쑥쑥 늘어납니다! 문제 임의의 문자열을 입력받아 문자열 내 모든 괄호의 Pair가 맞는지 확인한 후 결과를 반환합니다. 입력 string 타입의 괄호로 구성된 문자열 출력 Boolean 타입 주의사항 괄호는 먼저 열리고 ( '(' ) 닫혀야 ( ')' ) 합니다. 빈 문자열을 입력받는 경우 true를 반환해야 합니다. 괄호는 열린 만큼만 닫혀야 합니다. 예시 let output = balancedBrackets('('); console.log(output); // // ->.. 2022. 6. 16.
[Algorithm] BFS Queue 자바스크립트(primePassword 문제) 구현 primePassword 문제는 궁극적으로 BFS 알고리즘을 사용합니다. BFS 알고리즘에서는 Queue 자료구조를 사용하며, queue가 빈 배열이 될 때 까지 while문으로 반복을 진행합니다. Java에서는 queue 자료구조를 지원하지만 JS에서는 배열을 이요해 구현하는 과정이 별도로 필요합니다. 문제 특정 조건을 만족한 현재 비밀번호를 새로운 비밀번호로 변경하는데 필요한 최소한의 과정의 수를 반환하세요. 비밀번호는 계속 소수인 상태를 유지해야 하고, 숫자를 한개씩 바꿔나갈 때 최소 몇번의 숫자가 변경되어야 하는지를 반환해야 합니다. 한번에 한개의 숫자만 변경 가능합니다. 4자리의 소수인 비밀번호로만 변경이 가능합니다. 현재 비밀번호는 number 타입의 자연수 (1000 { queue.push(.. 2022. 6. 13.
[Backtracking] 백준 15651 N과 M 3단계 Node.js 구현하기 문제 문제링크 백준 15651 N과 M 3단계 이전 백트래킹 문제의 경우 중복되는 경우의 수를 모두 제거했지만, 이번 문제는 주옥을 허용한 모든 경우의 수를 표현합니다. 백트래킹은 DFS와 BFS 알고리즘과 같이 트리 구조상에 위치한 데이터를 검색할 수 있는 알고리즘입니다. 만약 특정 조건을 만족하는 경우 상위 노드로 이동하면서 검색을 계속 진행하게 됩니다. 백준 15651 문제의 경우 트리 구조의 모든 노드를 탐색한 완전탐색 백트래킹 알고리즘을 사용합니다. 추가적으로 문제를 제출할 때 배열의 요소별로 출력을 진행하면 시간초과 오류가 뜨게 됩니다. JAVA에서는 StringBuilder를 사용해서 출력하지만 Node.js 환경에서는 string에 담아 한번에 출력해줘야 시간초과 오류를 해결하게 됩니다. .. 2022. 6. 12.
[Algorithm] 백준 15649, 15650 JS 구현 ( 백트래킹 DFS 차이 ) 백트래킹 알고리즘 백준 15649 N과 M 문제 링크 https://www.acmicpc.net/problem/15649 백트래킹을 이해하는 기본적인 알고리즘이다. 백트래킹 알고리즘이란 모든 경우의 수를 모두 고려하는 알고리즘이다. 문제를 트리 구조로 표현할 때 적합한 방식이다. 구현하는 방식에 따라 DFS, BFS로 구분될 수 있다. 문제에서 출력값을 사전 순으로 출력해야 하기에 BFS보다는 DFS 알고리즘을 사용하는게 맞다. DFS 알고리즘과 백트래킹의 차이점은 DFS는 리프노드까지 무조건 탐색을 진행하지만 백트래킹은 특정 조건값을 통해 복귀 로직이 포함된다. DFS는 루트 노드에서 리프 노드까지 한번에 내려가는 방식이다. 예를 들어 미로 길 찾기 문제에서 막다른길 까지 도달한 후 길이 막히는 경우 .. 2022. 6. 11.
[Algorithm] treeBFS 알고리즘 Javascript Node.js 구현하기 treeBFS 알고리즘 문제 임의의 트리를 구성하는 노드 중 하나의 Node 객체를 입력받는다. 해당 Node를 시작으로 BFS(Breadth First Search) 알고리즘을 사용해서 전체 트리를 검색한다. 모든 Node의 value를 담은 배열을 반환한다. 입출력 'value', 'children' 속성을 가지는 객체 typeof node.value = number; typeof node.children = arr[Node] 예를 들어 입출력이 다음과 같이 주어질 때 전체 트리의 모습은 3 level로 구성된다. BFS 알고리즘은 동일 레벨을 우선적으로 탐색하기 때문에 최종적인 결과는 [1,2,3,4,5,7,6]이 될 것이다. let root = new Node(1); let rootChild1 =.. 2022. 6. 8.
[Algorithm] powerSet 알고리즘,문자열 부분 집합 문제 Javascript, Node.js 문제 하나의 집합으로 구성된 문자열을 입력받는다. 각각의 문자를 사용해서 만들 수 있는 모든 부분 집합을 반환하세요. 입력 string 타입, 공백 없는 소문자 알파벳 문자열 출력 배열을 반환한다. arr[i]는 문자열로 구성된 부분집합 주의사항 arr[i]는 알파벳 순서로 정렬되어야 한다. 부분집합은 빈 문자열을 포함한다. 출력값 arr는 사전식으로 정렬되어야 한다. 중복된 요소는 제거한다. 풀이 가장 먼저 입력받은 문자열의 중복을 제거해준다. Javascript에서 중복된 문자열을 제거하는 방법은 reduce 사용, Set사용, filter 함수를 사용하는 방법 총 3가지가 있다. 여기서는 간단하게 Set 함수를 사용한다. Set은 배열과 다르게 중복된 요소를 허용하지 않지만 배열의 순서를 보장하지는.. 2022. 6. 7.
[Algorithm] 퀵 정렬(Quick Sort) Javascript, Node.js 구현하기 (백준 2751 수 정렬하기 2) 퀵 정렬(Quick Sort) 퀵 정렬은 찰스 앤터니 리처드 호어가 개발한 정렬 알고리즘이다. 퀵 정렬은 재귀 알고리즘을 사용해 pivot과 positioning을 지정하면서 컴퓨터 아키텍처에서 메모리 효율적으로 작동하도록 작성된다. 퀵 정렬의 시간복잡도는 최악의 경우 O(N^2)이지만, 평균적인 시간복잡도는 O(N log N)이 된다. 퀵 정렬을 사용하게 되면 최악의 경우를 만나게 되는 경우는 극히 드물며, 매 단계에서 적어도 1개의 원소가 정렬되기 때문에 이후 정렬할 개수는 점점 줄어들게 된다. 또한 원소들 중 같은 값이 있는 경우 위치가 달라질 수 있기 때문에 속도는 빠르지만 정렬의 정확성에 대해서는 불완전 정렬에 속하고 있다. 퀵 정렬(Quick Sort) 알고리즘 구현 퀵 정렬 알고리즘을 떠받치.. 2022. 6. 5.
[Algorithm] 백준 2447번 별 찍기 - 10 Node.js Javascript 문제 링크 https://www.acmicpc.net/problem/2447 문제 재귀적인 패턴으로 별을 찍어보는 재귀 알고리즘 문제다. 3의 거듭제곱인 N이 주어지고 N x N으로 이뤄진 정사각형 안에서 특정 조건을 만족하는 별을 찍게 된다. 크기 3의 패턴은 가운데 공백이 존재하고, 가운데를 제외한 모든 영역에 별을 찍게 된다. N이 3보다 큰 경우 정사각형의 패턴은 가운데 공백으로 채워진 (N/3) x (N/3) 정사각형을 (N/3) 크기의 정사각형 패턴으로 둘러싼 형태가 된다. 예를 들어 N=3인경우 *** * * *** N=9인 경우 ********* * ** ** * ********* *** *** * * * * *** *** ********* * ** ** * ********* N=27인 경.. 2022. 6. 4.