본문 바로가기

Algorithm11

[Algorithm] 두 배열 합치기(Two Pointers) ❐ 두 배열 합치기 ▶︎ 문제 오름차순으로 정렬이 된 두 배열이 주어지면 두 배열을 오름차순으로 합쳐 출력하는 프로그램을 작성하세요. ▷ 입력 예제 [1, 3, 5], [2, 3, 6, 7, 9] ▶︎ 출력 예제 [1, 2, 3, 3, 5, 6, 7, 9] ▷ 문제설명 시간복잡도나 효율성을 고려하지 않고 문제를 풀 수 있는 가장 간단한 방법을 생각해보자. 두 개의 배열을 하나로 합친 뒤 자바스크립트의 sort( ) 메서드를 활용해서 배열을 정렬하는 방법을 떠올릴 수 있다. 이 방법은 간단하지만 최선이라고는 할 수 없다. 자바스크립트에서 사용되는 v8 엔진은 'Tim Sort'의 정렬 알고리즘을 사용하는데, 이것은 Merge Sort를 기반으로 최적화한 알고리즘이고 O(n log n)의 시간복잡도를 가진다.. 2022. 11. 4.
[Algorithm] 이진트리 너비우선탐색(BFS) ❐ 이진트리 너비우선탐색 ▶︎ 문제 아래 그림과 같은 이진트리를 너비우선탐색해 보세요. ▷ 출력 예제 1 2 3 4 5 6 7 ▶︎ 문제설명 너비우선탐색(BFS, Breadth First Search)은 시작 정점(vertex, 노드)에서 출발해 인접한 모든 정점들을 우선 방문 하는 방법이다. 시작 정점으로부터 멀리 떨어져 있는 정점은 나중에 순회하게 된다. 이런 점에서 앞서 포스팅했던 깊이우선탐색(DFS)과는 양상을 보인다. 혹자는 DFS와 BFS를 드라마를 보는 방식의 차이로 예를 들기도 한다. DFS는 하나의 드라마를 골라서 그것을 정주행해서 시청하며 하나의 시리즈를 다 볼 때까지 다른 드라마는 보지 않는 방식이라고 한다면, BFS는 여러 드라마를 하나씩 보는 방법이라고 할 수 있다. 이러한 차이는.. 2022. 10. 26.
[Algorithm] 경로 탐색(그래프-인접리스트) ❐ 경로 탐색(인접리스트) ▶︎ 문제 방향그래프가 주어지면 1번 정점에서 N번 정점으로 가는 모든 경로의 가지 수를 출력하는 프로그램을 작성하세요. 아래 그래프에서 1번 정점에서 5번 정점으로 가는 가지 수는 총 6가지 입니다. ▷ 입력 예제 5, [ [1, 2], [1, 3], [1, 4], [2, 1], [2, 3], [2, 5], [3, 4], [4, 2], [4, 5] ] ▶︎ 출력 예제 6 ▷ 문제설명 인접행렬은 그래프의 연결 관계를 이차원 배열로 나타내는 방법이다. 인접 행렬은 정점이 연결되어 있는지 확인하기 위해서 graph[a][b]의 요소만 확인할 수 있기 때문에 직관적이고 구현하기 쉽다는 장점이 있다. 하지만 구현해야 하는 그래프의 정점(vertex, 노드)의 개수가 10억개라면 어떨까.. 2022. 10. 23.
[Algorithm] 경로 탐색(그래프-인접행렬) ❐ 경로 탐색(인접행렬) ▶︎ 문제 방향그래프가 주어지면 1번 정점에서 N번 정점으로 가는 모든 경로의 가지 수를 출력하는 프로그램을 작성하세요. 아래 그래프에서 1번 정점에서 5번 정점으로 가는 가지 수는 총 6가지 입니다. ▷ 입력 예제 5, [ [1, 2], [1, 3], [1, 4], [2, 1], [2, 3], [2, 5], [3, 4], [4, 2], [4, 5] ] ▶︎ 출력 예제 6 ▷ 문제설명 그래프를 그려 문제를 해결해 보자. 인접 행렬은 그래프의 연결 관계를 이차원 배열로 나타내는 방식이다. 문제의 그래프는 정점이 단순히 연결되어 있을 뿐 아니라 방향을 가리키고 있다. 예를 들어 1번 정점(vertex, 노드)은 2, 3, 4번 정점을 가리키고 있고, 1번과 2번 정점은 서로를 가리키.. 2022. 10. 22.
[Algorithm] 조합 구하기(DFS) ❐ 조합 구하기 ▶︎ 문제 1부터 N까지 번호가 적힌 구슬이 있습니다. 이 중 M개를 뽑는 방법의 수를 출력하는 프로그램을 작성하세요. 자연수 N과 M이 입력됩니다. ▷ 입력 예제 4 2 ▶︎ 출력 예제 1 2 1 3 1 4 2 3 2 4 3 4 ▷ 문제설명 조합은 서로 다른 n개의 원소를 가진 집합에서 순서에 상관없이 r개의 원소를 선택하는 것을 말한다. 쉽게 말해 1부터 n까지 적혀있는 구슬 주머니에서 r개의 원소를 한번에 뽑는 경우의 수를 세는 것과 같다. 구슬을 뽑는 순서도 고려하는 순열과는 다르다. 문제처럼 자연수 4까지의 수에서 2개를 뽑는 경우의 수를 그림으로 도식화하면 다음과 같다. 총 2개를 뽑는데 숫자 1은 무조건 포함되어 있는 경우의 수는 3개, 숫자 2는 무조건 포함되어있고 앞선 조.. 2022. 10. 19.
[Algorithm] 팩토리얼 ❐ 팩토리얼 ▶︎ 문제 자연수 N을 입력하면 N!값을 구하세요. N! = n*(n-1)*(n-2)*....*2*1 입니다. 자연수 N이 입력됩니다. ▷ 입력 예제 5 ▶︎ 출력 예제 120 ▷ 문제설명 팩토리얼을 구현하는 방법은 다양할 것이다. 이번 포스팅에서는 두 가지 방법을 소개하겠다. - 첫번째 방법 function solution(n) { let answer = 1; function DFS(N) { if (N === 1) { return; } else { answer = answer * N; DFS(N - 1); } } DFS(n); return answer; } console.log(solution(5)); D(5)부터 시작해 D(4), D(3) ..... D(1)이 될때까지 호출을 계속한다. .. 2022. 10. 14.
[Algorithm] 순열 구하기(DFS) ❐ 순열 구하기 ▶︎ 문제 10이하의 N개의 자연수가 주어지면 이 중 M개를 뽑아 일렬로 나열하는 방법을 모두 출력합니다. 입력으로 M과 N개의 자연수가 오름차순으로 정렬된 배열이 주어집니다. ▷ 입력 예제 2, [3, 6, 9] ▶︎ 출력 예제 3 6 3 9 6 3 6 9 9 3 9 6 ▶︎ 문제 설명 순열은 서로 다른 n개의 원소에서 r개를 중복없이 순서에 상관있게 나열하는 것을 말한다. 이전 포스팅에서 중복순열은 중복을 허용하기 때문에 3 3과 같은 경우의 수가 가능했던 반면, 순열에서는 이것이 허용되지 않는다. ▷ 내 답안 function solution(m, arr) { let answer = []; let n = arr.length; let ch = Array.from({ length: n }.. 2022. 10. 13.
[Algorithm] 중복순열 구하기(DFS) ❐ 중복순열 구하기 ▶︎ 문제 1부터 N까지 번호가 적힌 구슬이 있습니다. 이 중 중복을 허락하여 M번을 뽑아 일렬로 나열하는 방법을 모두 출력합니다. ▷ 입력 예제 3 2 ▶︎ 출력 예제 1 1 1 2 1 3 2 1 2 2 2 3 3 1 3 2 3 3 ▷ 문제설명 일반적으로 순열은 서로 다른 n개 중 r개를 순서를 고려하여 나열하는 것을 말한다. 한 번 고른 것은 다시 고를 수 없는 것이 원칙이나, 중복순열의 경우에는 특별히 중복을 허용한다. 문제는 3까지의 번호가 적힌 구슬에서 두 개를 뽑아 중복을 허락하여 나열하는 경우의 수를 구하라고 한다. 즉, 주머니에 1부터 3까지 적혀있는 구슬 세개가 들어있다고 가정했을 때 ① 주머니에 들어있는 세개의 구슬 중 하나를 뽑아서 첫번째 자리 수를 정하고 ② 뽑은.. 2022. 10. 12.
[Algorithm] 합이 같은 부분집합(DFS) ❐ 합이 같은 부분집합 ▶︎ 문제 N개의 원소로 구성된 자연수 집합이 주어지면, 이 집합을 두 개의 부분집합으로 나누었을 때 두 부분집합의 원소의 합이 서로 같은 경우가 존재하면 "YES"를 출력하고, 그렇지 않으면 "NO"를 출력하는 프로그램을 작성하세요. 둘로 나뉘는 두 부분집합은 서로소 집합이며, 두 부분집합을 합하면 입력으로 주어진 원래의 집합이 되어야 합니다. 예를 들어 {1, 3, 5, 6, 7, 10} 이 입력되면 {1, 3, 5, 7} = {6, 10} 으로 두 부분집합의 합이 16으로 같은 경우가 존재하는 것을 알 수 있습니다. ▷ 입력 예제 1 3 5 6 7 10 ▶︎ 출력 예제 YES ▷ 내 답안 function solution(arr) { let answer = "NO"; let c.. 2022. 10. 9.
[Algorithm] 부분집합 구하기(DFS) ❐ 부분집합 구하기 ▶︎ 문제 자연수 N이 주어지면 1부터 N까지의 원소를 갖는 집합의 부분집합을 모두 출력하는 프로그램을 작성하시오. 단, 공집합은 출력하지 않습니다. ▷ 입력 예제 3 ▶︎ 출력 예제 1 2 3 1 2 1 3 1 2 3 2 3 ▷ 내 답안 function solution(n) { let answer = ""; let ch = Array.from({ length: n + 1 }, () => 0); function DFS(L) { if (L > n) { ch.forEach((ele, i) => { if (ele === 1) { answer = answer + i.toString(); } }); answer = ""; return; } else { ch[L] = 1; DFS(L + 1); .. 2022. 10. 8.