[알고리즘] 재귀 함수를 이용한 순열, 조합
·
알고리즘/풀이 힌트
순열? 모든 경우의 수를 계산하는 알고리즘이다. ( 순서 고려 O ) [ 1, 3, 5 ] 가 주어졌다면 1 3 5 1 5 3 3 1 5 3 5 1 5 1 3 5 3 1 처럼 모든 경우의 수를 구하는 방법이다. function permutations(arr, n) { if (n === 1) return arr.map((v) => [v]); let result = []; arr.forEach((fixed, idx, arr) => { const rest = arr.filter((_, index) => index !== idx); const perms = permutations(rest, n - 1); const combine = perms.map((v) => [fixed, ...v]); result.push..
[알고리즘] 재귀 함수를 이용한 트리 순회 알고리즘
·
알고리즘/풀이 힌트
재귀 함수를 이용하는 트리 순회는 전위 순회, 중위 순회, 후위 순회가 있다. 전위 순회 루트 노드를 방문하고, 왼쪽 서브 트리를 전위 순회한 뒤 오른쪽 서브 트리를 전위 순회하는 방식이다. 1 / \ / \ 2 3 / \ / \ 4 5 6 7 트리가 있다면 1. 루트 노드 [ 1 ] 을 방문한다. 2. [ 2 ]를 방문한다. 3. [ 2 ]의 왼쪽 서브 트리로 이동한다. 4. [ 4 ]를 방문한다. 5. [ 4 ]의 왼쪽, 오른쪽 서브 트리가 없으므로 올라간다. 6. [ 2 ]의 오른쪽 서브 트리로 이동한다. ... 방식으로 [ 1, 2, 4, 5, 3, 6, 7 ] 순서대로 순회한다. preorder(tree) { 방문(tree.root); preorder(tree.left); preorder(tre..
[알고리즘] 재귀함수 - JavaScript
·
알고리즘/풀이 힌트
재귀함수? 자기 자신을 호출하는 함수이다. 이때 호출은 Call Stack에 쌓여서 스택 자료구조와 유사하게 동작한다. 함수형 프로그래밍에선 루프 구현을 재귀로 하는 경우가 많다. 자바스크립트에서의 재귀함수 콜 스택에 제한이 있다. 자바스크립트 엔진마다 다르지만 크롬의 경우 약 1만개이다. 성능이 그렇게 좋지는 않다. 재귀함수를 사용하는 경우 피보나치 수열 앞 두 항의 합이 뒤 항의 값이 되는 수열 function fibonacci(x) { if(x
[알고리즘] 소수 범위 구하기
·
알고리즘
들어가며 소수구하기 - JavaScript를 먼저 공부한 다음 푼 문제입니다. 바로 풀리지 않거나 설명이 필요하다면 참고하는 것을 추천드립니다. 문제 설명 1부터 입력받은 숫자 n 사이에 있는 소수의 개수를 반환하는 함수, solution을 만들어 보세요. 소수는 1과 자기 자신으로만 나누어지는 수를 의미합니다. (1은 소수가 아닙니다.) 제한 조건 n은 2이상 1000000이하의 자연수입니다. 입출력 예 n result 10 4 5 3 입출력 예 설명 입출력 예 #1 1부터 10 사이의 소수는 [2,3,5,7] 4개가 존재하므로 4를 반환 입출력 예 #2 1부터 5 사이의 소수는 [2,3,5] 3개가 존재하므로 3를 반환 나의 풀이 const n = 10; function solution(n) { co..
[알고리즘] 소수 구하기 - JavaScript
·
알고리즘/풀이 힌트
소수 ? 1 또는 자기 자신만을 약수로 가지는 수를 의미한다. 소수를 구하는 방법 2부터 N - 1까지 루프를 돌며 나눠보기 소수를 구할 때 가장 먼저 생각할 수 있는 방법으로 O(n) 시간 복잡도를 가진다. function is_prime(num) { for (let i = 2; i < num; i += 1) { if(num % i === 0) { return false; } } return true } 다른 소수 구하는 방법에 비해 느린편에 속한다. 제곱근으로 확인하기 어떤 소수라도 N의 제곱근보다 큰 수로 나눠지지 않는다는 공식을 이용한다. 시간 복잡도는 O(sqrt(n)) 으로 훨씬 빠른 방법이다. function is_prime(num) { for (let i = 2; i * i < num; i..
[네이버 부스트캠프 7기] 너무 많이 늦은 4주차 회고
·
개발생활
들어가며 글을 쓴 시점은 이미 부스트캠프가 끝났는데, 여러가지 정신없이 살다보니 회고를 올리는 것을 까먹었다. ㅠㅠ 월요일 간단한? 구현 느낌이라고 생각이 들어서 비교적 간단하게 과제를 수행했다. 마지막 주라고 생각해서 엉청 어렵게 나올 거라고 걱정했는데, 생각보다 어렵진 않은 과제였다. 화요일 개발 스타일을 평소와는 다르게 작업을 해야하다보니 불편한 부분이 조금 있었다. 그리고 과제가 개인적으로 느끼기엔 직관적이지 않아서 해결에 시간이 걸렸다. 수요일 너무 재미있는 과제였다. 일단 과제가 직관적이여서 너무 좋았고 딱 맞게 하나씩 해결하니 퀴즈를 푸는 기분으로 재미있게 과제를 풀었던 것 같다. 목요일 동료 캠퍼들은 난이도가 있었다고 이야기가 나왔다. 하지만 나는 이날 저녁 약속이 있어서 빨리 해결하려고 ..
[네이버 부스트캠프 7기] 많이 늦은 3주차 회고
·
개발생활
들어가며 글을 쓴 시점은 이미 부스트캠프가 끝났는데, 여러가지 정신없이 살다보니 회고를 올리는 것을 까먹었다. ㅠㅠ 우선 3주차를 먼저 작성하고 4주차도 조만간 작성할 것이다! 월요일 2주 동안은 월요일이 비교적 쉬운 과제였는데 이번 주는 월요일에 익숙하지 않은 과제여서 그럴 수 있지만 어렵게 느껴졌다. 확실히 부스트캠프가 다양한 부분을 학습할 수 있다보니 잘 접하지 않았던 부분이 과제로 나와서 시간이 걸렸지만 또 하나의 지식을 얻을 수 있었다. 화요일 2주차도 그렇고 화요일은 생각보다 직관적인 과제가 나와서 ( 1주차가 너무 충격인걸 수 있지만.... ) 재미있게 과제를 수행한 것 같다. " 어떻게 하면 더 효율적으로 작업할까 "에 대한 고민을 하면서 작업하니 과제 중 제일 재미있었던 과제였다. 수요일..
[알고리즘] 배달 - BFS를 다시 공부하고
·
알고리즘
들어가며 이 전에 배달 문제를 풀었는데, 그땐 BFS를 정확하게 이해하지 못한 상태로 문제를 풀어서 코드 자체가 엉성했는데, 이번에 가장 먼 노드 문제를 풀고 다시 한번 도전해보았다. 문제 설명 N개의 마을로 이루어진 나라가 있습니다. 이 나라의 각 마을에는 1부터 N까지의 번호가 각각 하나씩 부여되어 있습니다. 각 마을은 양방향으로 통행할 수 있는 도로로 연결되어 있는데, 서로 다른 마을 간에 이동할 때는 이 도로를 지나야 합니다. 도로를 지날 때 걸리는 시간은 도로별로 다릅니다. 현재 1번 마을에 있는 음식점에서 각 마을로 음식 배달을 하려고 합니다. 각 마을로부터 음식 주문을 받으려고 하는데, N개의 마을 중에서 K 시간 이하로 배달이 가능한 마을에서만 주문을 받으려고 합니다. 다음은 N = 5, ..