본문 바로가기

알고리즘/개념

(7)
[JAVA] Union-Find 유니온 파인드(Union-Find) ① 유니온 파인드란? ▷ 대표적 그래프 알고리즘으로 '합집합 찾기'라는 의미를 가지고 있습니다. ▷ 상호 배타적 집합(Disjoint-set)이라고도 합니다. ▷ 여러 노드가 존재할 때, 두 개의 노드를 선택해서, 현재 두 노드가 서로 같은 그래프에 속하는지 판별하는 알고리즘이다. ▷ 2가지 연산으로 이루어져 있습니다. ▶ Find : x가 어떤 집합에 포함되어 있는지 찾는 연산 ▶ Union : x와 y가 포함되어 있는 집합을 합치는 연산 ② 그림으로 보는 Union-Find 위와 같이, 모두 연결되지 않고 각자 자기 자신만을 집합의 원소로 가지고 있을 때, 모든 값이 자기 자신을 가리키도록 만듭니다. i : 노드번호, P[i] : 부모 노드 번호 를 의미하며, 즉 ..
[JAVA] 이진탐색(Binary Search) 이진탐색 정렬된 리스트에서 원소를 반으로 분할(분류)하여 특정 값을 찾는 알고리즘 1. 중간 값(mid)이 찾고자 하는 값(value)보다 작을 경우 => 시작 값(start)이 중간 기준이 되고 다시 중간 값을 도출 2. 중간 값(mid)이 찾고자 하는 값(value)보다 클 경우 => 끝 값(end)이 중간 기준이 되고 중간 값을 다시 도출 3. 시작 값이 끝 값보다 클경우 반복문 종료 (start>end) 소스코드(반복문) package 개념; public class BinarySearch1 { // 이진탐색 - 반복문 public static void main(String[] args) { int[] arr = { 1, 2, 3, 4, 5, 6 }; // ex) 3을 찾을때 int value = ..
[JAVA] 최장 증가 수열 LIS (Longest Increasing Subsequence) 최장증가수열(LIS)란 ? 어떤 임의의 수열이 주어졌을때, 이 수열에서 몇 개의 수들을 제거해서 부분수열을 만들 수 있다. 이 때 만들어진 부분수열 중 오름차순으로 정렬된 가장 긴 수열을 최장증가수열이라고 한다. 동적계획법으로 풀 수 있는 알고리즘 중 하나 예시 수열 A가 주어졌을 때, 가장 긴 증가하는 부분 수열 예를 들어, 수열 A = {10, 20, 10, 30, 20, 50} 인 경우에 가장 긴 증가하는 부분 수열은 A = {**10**, **20**, 10, **30**, 20, **50**} 이고, 길이는 4이다. 방법 수열이 들어있는 배열 : array 인덱스마다 각 증가 수열의 길이 배열 : dp Step 1. 2중포문 j : i를 기준으로 인덱스 0에서부터 i-1까지 체크한다. Step ..
[JAVA] 부분집합(SubSet) 구현 - 비트마스크 부분집합 비트 연산을 사용하여 부분집합 구현 방법 arr[] = 1부터 5까지 담겨있는 배열 n = 5 (배열 사이즈) Step 1. i - for문 : (1
[JAVA]플로이드-와샬(Floyd-Warshall) 알고리즘 플로이드-와샬? 모든 최단 경로를 구하는 방법, 음의 가중치 간선 가능 방법 Step 1. D[][] : 자기자신으로의 인접이 아니고 갈 수 없는 경로라면 INF Step 2. k 경 i 출 j 도 : 경유지와 도착지가 같거나 출발지와 도착지가 같다면 패스 Step 3. 출발지에서 도착지까지의 가중치의 합이 경유지를 들렸을 때값보다 클 경우 갱신 소스 코드 import java.util.Scanner; public class FloydTest { static final int INF = 9999999; public static void main(String[] args) { Scanner sc = new Scanner(System.in); int N = sc.nextInt(); int[][] D = ne..
[JAVA]다음 순열(NextPermutation) NextPermutation ? - 첫 번째 단계로는 맨 뒤에서부터 탐색하며, 교환할 위치를 찾아야한다. - 뒤쪽부터 탐색하며, i보다 값이 작은 i-1 인덱스를 발견하는 순간이 교환할 위치 i-1이 된다. - 두 번째 단계로는 내가 찾은 i-1 인덱스의 배열 값과, 교환할 i-1보다 큰 위치 j를 찾는 것이다. - 이렇게 찾은 i-1자리와 j의 값을 교환한다. - 마지막으로는, 다음 순열의 사전순의 특징을 위해 i번째 인덱스부터 맨마지막 인덱스의 배열 값을 오름차순으로 바꿔주는 작업이 필요하다. 방법 Step 1. 뒷쪽부터 왼쪽으로 탐색하며 교환이 필요한 위치 찾기 찾은위치가 0이면 이미 내림차순된 순열이므로 다음순열은 없다. Step 2. i-1위치 : 교환이 필요한 위치, i-1위치값과 교환할 뒷쪽..
[JAVA]다익스트라 알고리즘(Dijkstra Algorithm) 다익스트라 알고리즘이란? => 하나의 정점에서 다른 모든 정점까지의 최단 경로를 구하는 문제 (간선들은 모두 양의 간선이어야 한다) => 정점 A와 정점 B를 연결하는 경로 중 간선들의 가중치 합이 최소가 되는 경로 방법 Step1. 미방문 정점 중 최적 비용이 최소인 것 찾기 Step2. 선택 정점 방문하고 경유지로 고려하여 미방문정점들로 가는 최적비용을 최적화 소스코드 import java.io.BufferedReader; import java.io.IOException; import java.io.InputStreamReader; import java.util.Arrays; import java.util.StringTokenizer; public class DijkstraTest { public s..