Algorithm & Data Structure 7

Manacher 알고리즘 (Manacher's Algorithm)

✅ 팰린드롬(palindrome) 이란?팰린드롬은 순방향으로 읽었을 때와 역방향으로 읽었을 때 같은 문자열을 의미한다.문자열뒤집은 문자열결과AApalindromeBBBBpalindromeABDDSSDDBAnot palindromeABDDBAABDDBApalindrome  🤔 문제: 가장 긴 팰린드롬 부분 문자열(palindrome substring) 찾기BANANANA 문자열에서 가장 긴 팰린드롬 부분 문자열은 BANANANA 이다.이렇게 특정 문자열에서 가장 긴 팰린드롬 부분 문자열을 구하려면 어떻게 해야할까? 💡 기존 풀이아마 이 문제가 나오면 문자열의 길이가 O(N^2)의 시간복잡도로 해결할 수 있을 정도로 짧게 주어질 것이다. 그러니 냅다 풀어보자. (1) 팰린드롬의 중심 문자부터 탐색홀수 길..

[heap] heapify(build heap)의 시간 복잡도

힙(heap) 힙은 아래 속성을 만족하는 완전 이진 트리(complete binary tree) 기반 자료구조다. 최대 힙(max heap)에서 주어진 노드 C에 대해 P가 C의 부모 노드라면 P의 키(값)는 C의 키보다 크거나 같다. 최소 힙(min heap)에서는 P의 키가 C의 키보다 작거나 같다. Sift Up 연산 힙에 노드를 추가할 때는 sift up 연산이 동작한다. 해당 연산은 리프 노드의 값으로 시작해 값을 위 노드의 값과 연속적으로 교환하여 값을 루트를 향해 경로 위로 이동한다. 위(부모) 노드와 비교해 트리의 속성을 만족할 때까지, 또는 루트 노드에 도달할 때까지 연산을 계속한다. 최소 힙에 노드(값 18)를 추가하는 과정 위 영상에서 새 노드(값 18)은 완전 이진 트리를 만족하기 ..

[JAVA] 7570, 2631 줄 세우기

난이도 골드3, 골드4 알고리즘: DP 두 문제의 기본 조건은 같다. 1부터 N까지의 번호를 가진 아이들이 무작위 순서를 가지고 일렬로 서있다. 번호 순서대로 배치하기 위해 옮겨지는 아이의 최소 수를 구해야 하는 것도 같다. 다만 아이를 옮기는 방식이 다르다. 7570번: 줄 서있는 어린이 중 한 명을 선택하여 제일 앞이나 제일 뒤로 보낸다. 2631번: 줄 서있는 어린이 중 한 명을 선택하여 다른 어린이와 자리를 바꾼다. 우선 2631번부터 보면, 아무 자리로 옮길 수 있으므로 이미 번호 순서대로 서있는 아이들을 제외한 나머지 아이들을 순서에 맞게 이동시키면 정답이다. 예를 들어 다음과 같은 N=6의 배열이 있다면 [3, 5, 6] 혹은 [1, 2, 4]가 이미 번호 순서대로 서있는 가장 긴 수열이다...

[JAVA] 2842 집배원 한상덕

난이도 플래티넘5 알고리즘: 투 포인터, DFS/BFS 배달하면서 방문한 칸 중 가장 높은 곳과 낮은 곳의 고도 차이를 피로도라고 하자. 이때, 가장 작은 피로도로 모든 집에 배달을 하려면 어떻게 해야 하는지 구하는 프로그램을 작성하시오. 이 문제에서는 경로 혹은 거리가 중요하지 않다. 가장 작은 피로도로 우체국과 모든 집을 방문할 수 있으면 된다. 따라서 가장 작은 피로도를 만드는 '가장 높은 곳'과 '가장 낮은 곳'을 구해야 한다. 최대 고도와 최소 고도를 정해야 한다는 것이다. 그렇다면 지도에 존재하는 모든 피로도를 탐색하며 최대 고도와 최소 고도를 정한 후, 해당 범위로 조건을 만족할 수 있는 지 검사하면 된다. 하지만, 이렇게 완전 탐색으로 문제를 풀면 굳이 시간 복잡도를 계산하지 않아도 시간이..

[JAVA] Union-Find 알고리즘

Union-Find 알고리즘 공통 원소가 없는 두 집합을 서로소 집합이라고 한다. Union-Find 알고리즘은 많은 서로소 부분 집합들로 나눠진 원소들에 대한 정보를 저장하는 자료구조를 나타낸다. 그래프 혹은 트리 자료구조에서 두 노드가 같은 그래프에 속해 있는지 알 수 있다. 서로소 집합은 기본적으로 세 가지 연산으로 구성되어 있다. 1. Make Set 연산 각 원소에 대해 집합을 만드는 연산으로, 자기 자신을 하나의 집합으로 만든다. 따라서 각 집합의 대표자는 원소 자신이 된다. int[] parents = new int[N]; private static int makeSet() { for(int idx = 0; idx < parents.length; idx++) { parents[idx] = i..

[JAVA] 20442 ㅋㅋ루ㅋㅋ

난이도 골드2 알고리즘: 투 포인터 문제 풀이를 위해 파악해야 할 중요한 점은 두 가지이다. 입력 문자열의 길이는 최대 3,000,000이다. ㅋㅋ루ㅋㅋ 문자열은 좌우대칭이다. 우선 입력이 크기 때문에 최대한 O(N)으로 연산을 해야한다. 즉 문자열의 각 원소에 대해 한번만 탐색하고 지나가는 풀이를 고안해야 한다는 것이다. 두번째로 ㅋㅋ루ㅋㅋ 문자열은 R을 중심으로 같은 개수의 K가 양 쪽에 붙은 좌우 대칭이다. 이 두 가지 특징을 통해 투 포인터를 떠올릴 수 있어야 한다. 투 포인터까지 떠올렸으면, 이제 각 포인터를 어떻게 움직여야 할 지 생각해야 한다. ㅋㅋ루ㅋㅋ 문자열은 K 사이에 R이 있는 문자열이다. (물론 K는 없을 수 있음) 따라서 투 포인터 바깥의 K와 안 쪽의 R로 ㅋㅋ루ㅋㅋ 문자열을 생..