Cute Hello Kitty Kaoani

Algorithm/알고리즘

Algorithm/알고리즘

[JAVA] 그리디 알고리즘 : 현재 상황에서 가장 좋아보이는 것만 고르는 방법

그리디 알고리즘(탐욕법)은 현재 상황에서 지금 당장 좋은 것만 고르는 방법을 의미한다. 일반적인 그리디 알고리즘 문제를 풀기 위한 최소한의 아이디어를 떠올릴 수 있는 능력을 요구한다. 일반적인 상황에서 그리디 알고리즘은 최적의 해를 보장할 수 없을 때가 많다. 하지만 코테에서의 대부분 그리디 문제는 탐욕법으로 얻은 해가 최적의 해가 되는 상황에서, 이를 추론할 수 있어야 풀리도록 출제된다. 거스름 돈 카운터에는 거스름돈으로 사용할 500원, 100원, 50원, 10원짜리 동전이 무한히 존재한다고 가정한다. 손님에게 거슬러 주어야 할 돈이 N원일 때 거슬러 주어야 할 동전의 최소 개수를 구하세요. 단 N은 항상 10의 배수입니다. 최적의 해를 빠르게 구하기 위해서는 가장 큰 화폐 단위부터 돈을 거슬러 주면..

Algorithm/알고리즘

벨만 포드 알고리즘 : 비용이 음수인 간선이 있을 때 최단 경로 계산

모든 간선의 비용이 양수일 때는 다익스트라 최단 경로 알고리즘을 사용하면 된다. 하지만 음수 간선이 포함된다면? 음수 간선이 있는 경우 음수 간선 순환이 없는 경우 음수 간선 순환이 있는 경우 벨만 포드 알고리즘은 음수 간선의 순환을 감지할 수 있으며 음의 간선이 포함된 상황에서 사용할 수 있다. 시간복잡도는O(VE)로 다익스트라 알고리즘에 비해 느리다. 동작과정 1. 출발 노드 설정 2. 최단 거리 테이블 초기화 3. V-1번 반복 3-1. 전체 간선 E개를 하나씩 확인 3-2. 각 간선을 거쳐 다른 노드로 가는 비용을 계산하여 최단 거리 테이블 갱신 4. 음수 간선 순환이 발생하는지 체크하고 싶다면 3번의 과정을 한 번 더 수행 → 최단 거리 테이블이 갱신된다면 음수 간선 순환이 존재 다익스트라 vs..

Algorithm/알고리즘

시간제한과 시간복잡도

대략 1억 번의 연산이 1초가 걸린다. O(1억) = 1초 빅오 N O(N) 약 1억 O(NlogN) ≤ 10,000,000 (약 1000만) O(N2) ≤ 10000 O(N3) ≤ 500

Algorithm/알고리즘

✨그래프 알고리즘 비교✨

알고리즘 클릭 시, 해당 페이지로 이동 정점 중심 구현 최단 경로: 두 노드 사이의 경로들 중 간선의 가중치 합이 최소인 경로를 찿는 알고리즘 다익스트라 알고리즘 : 특정한 노드에서 출발하여 다른 모든 노드로 가는 최단 경로 O(ElogV) 플로이드 워셜 알고리즘 : 모든 노드에서 다른 모든 노드의 최단 경로 O(V3) 최소 신장 트리(MST): 최소한의 비용으로 모든 노드를 포함하면서 사이클이 존재하지 않는 그래프 프림 알고리즘 : 시작 노드에서 가까운 노드를 선택하여 트리 구성 ➜ 사이클 검사X O(V2) 간선 중심 구현 최단 경로 벨만포드 알고리즘 : 음의 가중치를 허용 최소 신장 트리(MST) 크루스칼 알고리즘 : 최소 비용의 간선을 차례대로 대입하여 트리를 구성 ➜ 사이클 검사必 O(ElogE)..

Algorithm/알고리즘

프림 알고리즘 : 최소 신장 트리(MST)를 찾는 알고리즘

프림 알고리즘 최소 신장 트리(MST)를 찾기 위한 알고리즘이다. 프림 알고리즘은 주어진 그래프에서 시작 정점을 선택하고 해당 정점을 기준으로 MST를 구축해나가는 방식으로 동작한다. 1. 시작 정점을 우선순위 큐에 넣는다. (우선순위 큐는 가중치에 따라 오름차순 정렬되어야 함) 2. 우선순위 큐에서 노드 하나를 꺼내 MST에 포함되어 있는지 확인 2-1. 포함되어 있다면 무시. 다시 1번으로 2-2. 포함되어 있지 않다면 방문처리 후 해당 노드와 연결된 노드를 우선순위 큐에 추가 3. 2번 과정 반복 최소 신장 트리에 대해서는 크루스칼 알고리즘 참고! static class Edge implements Comparable { int v; int cost; public Edge(int v, int cos..

Algorithm/알고리즘

크루스칼 알고리즘 : 최소 신장 트리(MST)를 찾는 알고리즘

신장 트리란 그래프에서 모든 노드를 포함하면서 사이클이 존재하지 않는 부분 그래프를 의미한다. 모든 노드가 포함되어 서로 연결되면서 사이클이 존재하지 않는다는 조건은 트리의 조건이기도 하다. 최소 신장 트리(MST) 최소한의 비용으로 구성되는 신장 트리를 찾아야 하는 경우 → 예를 들어 N개의 도시가 있을 때, 두 도시 사이에 도로를 놓아 전체 도시가 서로 연결되도록 최소한의 비용으로 도로를 설치하는 경우 크루스칼 알고리즘 크루스칼 알고리즘은 대표적인 최소 신장 트리 알고리즘으로 간선을 중심으로 해결한다. 그리디 알고리즘으로 분류된다. 동작과정 1. 간선 데이터를 비용에 따라 오름차순 정렬 2. 간선을 하나씩 확인하며 현재의 간선이 사이클을 발생시키는지 확인 2-1. 사이클이 발생하지 않는 경우 최소 신..

Algorithm/알고리즘

유니온 파인드(Union-Find) : 서로소 집합을 판단하기 위한 자료구조

서로소 집합이란 공통 원소가 없는 두 집합을 의미한다. 서로소 집합 자료구조 서로 부분 집합들로 나누어진 원소들의 데이터를 처리하기 위한 자료구조이다. 합집합 Union : 두 개의 원소가 포함된 집합을 하나의 집합으로 합치는 연산 찾기 Find : 특정한 원소가 속한 집합이 어떤 집합인지 알려주는 연산 서로소 집합 자료구조는 Union-Find 자료구조라고 한다. 동작과정 0. 노드 개수 크기의 부모 테이블을 자신의 값을 갖도록 초기화 1. 합집합 Union 연산을 확인하여 서로 연결된 두 노드 A, B를 확인 A와 B의 루트 노드 A’, B’를 각각 찾는다 A’를 B’의 부모 노드로 설정한다 2. 모든 합집합 Union 연산을 처리할 때까지 1번 과정 반복 #예시 Union(1, 4) Union(2,..

Algorithm/알고리즘

플로이드 워셜 알고리즘 : 모든 출발지에서 다른 모든 출발지까지 최단 경로 계산

플로이드 워셜 플로이드 워셜 알고리즘은 모든 노드에서 다른 모든 노드까지의 최단 경로를 모두 계산한다. 다익스트라 알고리즘과 마찬가지로 단계별로 거쳐가는 노드를 기준으로 알고리즘을 수행한다. 다만 매 단계에서 방문하지 않은 노드 중 최단 거리를 갖는 노드를 찾는 과정이 필요하지 않다. 플로이드 워셜은 2차원 테이블에 최단 거리 정보를 저장하며 동적계획법(DP) 유형에 포함된다. 각 단계마다 특정한 노드 k를 거쳐가는 경우를 확인한다. a에서 b로 가는 최단거리보다 a에서 k를 거쳐 b로 가는 거리가 더 짧은지 체크한다. 따라서 점화식은 다음과 같다. 동작과정 인접한 노드만 확인하여 최단 거리 테이블을 초기화한다. 1번 노드(k)를 거쳐가는 경우를 고려하여 테이블을 갱신한다. 이후 반복하여 n번 노드를 거..

Algorithm/알고리즘

다익스트라 알고리즘 : 하나의 출발점에서 다른 모든 출발지까지 최단 경로 계산

최단 경로 알고리즘은 간선의 가중치가 있는 그래프에서 두 정점 사이의 경로들 중 간선의 가중치 합이 최소인 경로를 찿는 알고리즘을 의미한다. 다익스트라 알고리즘 다익스트라 알고리즘은 특정한 노드에서 출발하여 다른 모든 노드로 가는 최단 경로를 계산한다. 그리디 알고리즘으로 분류되며 매 상황에서 가장 비용이 적은 노드를 선택해 임의의 과정을 반복한다. 동작과정 1. 출발노드 설정 2. 최단 거리 테이블 초기화 ➜ 기본적으로 모든 노드까지 가는 비용을 무한으로 3. 방문하지 않은 노드 중 최단 거리가 가장 짧은 노드 선택 4. 해당 노드를 거쳐 다른 노드로 가는 비용을 계산하여 최단 거리 테이블 갱신 5. 위 과정에서 3번, 4번 반복 최단 거리 테이블은 각 노드에 대한 현재까지의 최단 거리 정보를 가지고 ..

Algorithm/알고리즘

[이코테] 다양한 동적 계획법(DP) 문제 풀이 - JAVA 자바

개미전사 개미전사는 부족한 식량을 충당하고자 메뚜기 마을의 식량창고를 몰래 공격하려고 한다. 메뚜기 마을에는 여러 개의 식량창고가 있는데 식량창고는 일직선으로 이어져 있다. 각 식량창고에는 정해진 수의 식량을 저장하고 있으며 개미 전사는 식량창고를 선택적으로 약탈하여 식량을 빼앗을 예정이다. 이때 메뚜기 정찰병들은 일직선상에 존재하는 식량창고 중에서 서로 인접한 식량창고가 공격받으면 바로 알아챌 수 있다. 따라서 개미 전사가 정찰병에게 들키지 않고 식량창고를 약탈하기 위해서는 최소한 한 칸 이상 떨어진 식량창고를 약탈해야 한다. 개미 전사는 식량창고가 일직선상일 때 최대한 많은 식량을 얻기를 원한다.개미 전사를 위해 식량창고 N개에 대한 정보가 주어졌을 때 얻을 수 있는 식량의 최댓값을 구하는 프로그램을..

Algorithm/알고리즘

[JAVA/알고리즘] 동적계획법 (DP, Dynamic Programming)

동적계획법(DP)은 메모리를 적절히 사용하여 수행 시간 효율성을 향상시키는 기법이다. 이미 계산된 결과는 별도의 메모리 영역에 저장하여 다시 계산하지 않도록 하여 시간복잡도를 획기적으로 줄일 수 있다. DP 문제 조건 최적 부분 구조 (Optimal Substructure) 큰 문제를 작은 문제로 나눌 수 있으며 작은 문제의 답을 모아 큰 문제를 해결할 수 있는 경우 중복되는 부분 문제 (Overlapping Subproblem) 동일한 작은 문제를 반복적으로 호출하여 해결해야 할 경우 2748번: 피보나치 수 2 피보나치 수는 0과 1로 시작한다. 0번째 피보나치 수는 0이고, 1번째 피보나치 수는 1이다. 그 다음 2번째 부터는 바로 앞 두 피보나치 수의 합이 된다. 이를 식으로 써보면 Fn = Fn..

Algorithm/알고리즘

[JAVA] 바이너리 인덱스 트리 (Binary Indexed Tree, BIT)

바이너리 인덱스 트리(Binary Indexed Tree, BIT)는 2진법 인덱스 구조를 활용해 구간 합 문제를 해결해 줄 수 있는 자료구조이다. 펜윅 트리(fenwick tree)라고도 한다. 바이너리 인덱스 트리를 구현하려면, 어떤 수 X를 이진수로 나타냈을 때, 0이 아닌 마지막 비트를 알아야한다. 0이 아닌 마지막 비트를 찾는 방법 어떤 수 X의 0이 아닌 마지막 비트를 찾기 위해서 X & -X를 계산하면 된다. L[i]는 i를 2진수로 나타냈을 때, 0이 아닌 마지막 비트값을 저장하고 있는 배열이다. 즉, 3을 이진수로 나타냈을 때 011 이므로 0이 아닌 가장 마지막 비트값은 L[3]=1 이다. Tree[i]는 arr[i]로부터 앞으로 L[i] 개의 합을 저장하고 있는 배열이다. - Tree..

gangintheremark
'Algorithm/알고리즘' 카테고리의 글 목록