본문 바로가기

Programming/알고리즘

(23)
투 포인터 vs 슬라이딩 윈도우 투 포인터와 슬라이딩 윈도우는 선형 공간 내 연속 구간에 대한 알고리즘이며, 주로 구간 합, 부분 수열의 합을 구하고 비교할 때 사용한다. 특히 1차원 배열을 2회 이상 탐색해야 할 때 시간 복잡도를 O(N^2)에서 O(N)으로 낮춰주는 특징이 있다. 다만 투 포인터는 start, end 포인터를 가변적으로 이동시키고, 슬라이딩 윈도우는 고정된 window 구간을 이동시킨다는 점에서 차이를 보인다. 처음 두 알고리즘을 접했을 땐 그 차이가 크게 다가오지 않았기 때문에 각 알고리즘에 대해 자세히 적어보고자 한다. 투 포인터 : 2개의 포인터(인덱스)를 이동시키며 값을 구하는 알고리즘 start와 end 포인터는 모두 인덱스 0에서 출발하거나, 각각 맨앞과 맨뒤 인덱스에서 시작한다. 구하고자 하는 값(ex...
이분 탐색 이분 탐색 : 정렬된 숫자들의 중간값과 target 값을 비교하여 탐색 범위를 절반씩 줄여가는 알고리즘 ※ 중간값 = (a+b)/2 이분 탐색 시 소수점 이하는 내림하여 중간값을 구함 시간복잡도 : O(log n) (새로 정렬해야 하면 O(nlogn)) 연산마다 탐색 범위를 절반 줄이므로 모든 숫자들을 선형 탐색하는 것보다 상대적으로 빠르다 코드 기본 while (left arr[mid]){ // target 값이 배열 중간값보다 크면 left = mid + 1; // 우측 탐색 } else if (target < arr[mid]){ right = mid - 1; // 좌측 탐색 } else { return mid; } } return -1; while문 안에서 target 값과 배열 내 중간값을 비교해..
[백준/자바] dp 1010번 - 다리 놓기 문제 재원이는 한 도시의 시장이 되었다. 이 도시에는 도시를 동쪽과 서쪽으로 나누는 큰 일직선 모양의 강이 흐르고 있다. 하지만 재원이는 다리가 없어서 시민들이 강을 건너는데 큰 불편을 겪고 있음을 알고 다리를 짓기로 결심하였다. 강 주변에서 다리를 짓기에 적합한 곳을 사이트라고 한다. 재원이는 강 주변을 면밀히 조사해 본 결과 강의 서쪽에는 N개의 사이트가 있고 동쪽에는 M개의 사이트가 있다는 것을 알았다. (N ≤ M) 재원이는 서쪽의 사이트와 동쪽의 사이트를 다리로 연결하려고 한다. (이때 한 사이트에는 최대 한 개의 다리만 연결될 수 있다.) 재원이는 다리를 최대한 많이 지으려고 하기 때문에 서쪽의 사이트 개수만큼 (N개) 다리를 지으려고 한다. 다리끼리는 서로 겹쳐질 수 없다고 할 때 다리를 지..
[백준/자바] 이분탐색 2805번 - 나무 자르기 문제 상근이는 나무 M미터가 필요하다. 근처에 나무를 구입할 곳이 모두 망해버렸기 때문에, 정부에 벌목 허가를 요청했다. 정부는 상근이네 집 근처의 나무 한 줄에 대한 벌목 허가를 내주었고, 상근이는 새로 구입한 목재절단기를 이용해서 나무를 구할것이다. 목재절단기는 다음과 같이 동작한다. 먼저, 상근이는 절단기에 높이 H를 지정해야 한다. 높이를 지정하면 톱날이 땅으로부터 H미터 위로 올라간다. 그 다음, 한 줄에 연속해있는 나무를 모두 절단해버린다. 따라서, 높이가 H보다 큰 나무는 H 위의 부분이 잘릴 것이고, 낮은 나무는 잘리지 않을 것이다. 예를 들어, 한 줄에 연속해있는 나무의 높이가 20, 15, 10, 17이라고 하자. 상근이가 높이를 15로 지정했다면, 나무를 자른 뒤의 높이는 15, 15..
[백준/자바] 백트래킹 9663번 - N-Queen 문제 N-Queen 문제는 크기가 N × N인 체스판 위에 퀸 N개를 서로 공격할 수 없게 놓는 문제이다. N이 주어졌을 때, 퀸을 놓는 방법의 수를 구하는 프로그램을 작성하시오. ※ 체스 규칙 상 퀸은 직선, 대각선으로 이동 가능함 = 같은 행, 열, 또는 대각선상에 놓인 퀸은 서로 공격 가능 해결 백트래킹 백트래킹은 탐색 조건이 있는 DFS라고 볼 수 있다. DFS 과정에서 조건에 부합하는 노드는(promising) 계속 탐색하고, 조건에 부합하지 않는 노드는 탐색에서 배제한다(pruning). 1. promising(유망한) 조건에 부합하는 노드일 때 유망하다고 한다. promising 검사에서 통과 시(조건에 부합할 때) 다음 depth로 넘어가 DFS 탐색을 계속한다. 2. pruning(가지치..
[백준/자바] dp 11053번 - 가장 긴 증가하는 부분 수열 문제 수열 A가 주어졌을 때, 가장 긴 증가하는 부분 수열을 구하는 프로그램을 작성하시오. 예를 들어, 수열 A = {10, 20, 10, 30, 20, 50} 인 경우에 가장 긴 증가하는 부분 수열은 A = {10, 20, 10, 30, 20, 50} 이고, 길이는 4이다. 풀이 작은 부분 문제들로 나눠 그 결과를 저장하면서 반복 계산해 (DP) 풀 수 있는 문제이다. 단, 이때 시간복잡도는 이중 for문 연산으로 인해 N^2 이 된다. public class LIS { public static int[] seq; // 입력값 배열 public static int[] dp; // DP 배열 (dp[i]는 seq[i]까지의 최장부분수열 길이) public static void main(String[] a..
[자료구조] 우선순위 큐, 힙 우선순위 큐 (Priority Queue) : 우선순위가 높은 데이터가 먼저 반환되는 자료구조 힙으로 구현 배열, 리스트 : 삽입 시 모든 데이터 탐색해야 하므로 시간복잡도 O(n) 힙 : 삭제, 삽입 시 부모-자식 비교 반복 → 트리의 높이가 하나 증가할 때마다 비교 연산 횟수는 1회 증가하여 시간복잡도 O(logn) 힙 (Heap) 특징 완전이진트리 모든 노드에 저장된 값(우선순위)들은 자식 노드들 값보다 크거나 같음 루트노드가 가장 큰 우선순위를 가짐 힙을 구현하는 일반적인 자료구조 => 배열 종류 최대 힙 값이 클수록 우선순위가 높은 완전이진트리 최소 힙 값이 작을수록 우선순위가 높은 완전이진트리 구현 삽입(저장) 새 노드를 우선순위가 가장 낮다는 가정으로 맨 끝 위치에 삽입시킨 후 부모노드와 비..
[백준/자바] 트리 1967번 - 트리의 지름 문제 트리(tree)는 사이클이 없는 무방향 그래프이다. 트리에서는 어떤 두 노드를 선택해도 둘 사이에 경로가 항상 하나만 존재하게 된다. 트리에서 어떤 두 노드를 선택해서 양쪽으로 쫙 당길 때, 가장 길게 늘어나는 경우가 있을 것이다. 이럴 때 트리의 모든 노드들은 이 두 노드를 지름의 끝 점으로 하는 원 안에 들어가게 된다. 이런 두 노드 사이의 경로의 길이를 트리의 지름이라고 한다. 정확히 정의하자면 트리에 존재하는 모든 경로들 중에서 가장 긴 것의 길이를 말한다. 입력으로 루트가 있는 트리를 가중치가 있는 간선들로 줄 때, 트리의 지름을 구해서 출력하는 프로그램을 작성하시오. 아래와 같은 트리가 주어진다면 트리의 지름은 45가 된다 입력 첫 번째 줄은 노드의 개수 n(1 ≤ n ≤ 10,000) ..
[자료구조] 이진 탐색 트리 참고 : 더보기 https://velog.io/@kimdukbae/%EC%9D%B4%EB%B6%84-%ED%83%90%EC%83%89-%EC%9D%B4%EC%A7%84-%ED%83%90%EC%83%89-Binary-Search https://velog.io/@younseo1016/%EC%9D%B4%EB%B6%84%ED%83%90%EC%83%89%EA%B3%BC%EC%8B%9C%EA%B0%84%EB%B3%B5%EC%9E%A1%EB%8F%84 https://ratsgo.github.io/data%20structure&algorithm/2017/10/22/bst/ https://mommoo.tistory.com/101 이진 탐색 트리 (Binary Search Tree) 정의 효율적인 탐색, 빈번한 삽입과 삭..
[자료구조] 트리 - 이진 트리 유형 트리와 그래프에 대해 작성하던 중 트리의 종류(이진 트리, 이진 탐색 트리)에 대한 하위 카테고리가 다양한 것을 확인해 각 종류에 대한 글을 따로 작성하기로 했다. 이진 트리 (Binary Tree, B-Tree) : 자식 노드를 최대 2개 가질 수 있는 트리 종류 전 이진 트리, 완전 이진 트리, 포화 이진 트리, 균형 이진 트리, 편향 이진 트리 ※ 하나의 이진 트리는 위 카테고리 여러 개에 동시에 해당할 수도 있음 전(or 정) 이진 트리 (Full/Strict Binary Tree) 모든 노드가 0개 또는 2개의 자식 노드를 가짐 완전 이진 트리 (Complete Binary Tree) 마지막 레벨 외 노드들은 모두 채워져 있어야 함 (2개의 자식 노드) 말단 노드들은 왼쪽에서부터 차례대로 채워짐..