본문 바로가기

분류 전체보기

(87)
C++ 백준 17404 (RGB거리 2) 백준 17404 (RGB거리 2) https://www.acmicpc.net/problem/17404 17404번: RGB거리 2 첫째 줄에 집의 수 N(2 ≤ N ≤ 1,000)이 주어진다. 둘째 줄부터 N개의 줄에는 각 집을 빨강, 초록, 파랑으로 칠하는 비용이 1번 집부터 한 줄에 하나씩 주어진다. 집을 칠하는 비용은 1,000보다 작거나 www.acmicpc.net 이 문제는 백준 1149(RGB거리)의 응용버전이다. 1149번 RGB거리에 대한 설명은 여기(링크)에 있으니 DP관점의 해결방법을 알고오자. 기존 1149번(이하 RGB거리1)문제와 달리 하나의 조건이 추가되었다. 처음집과 마지막집의 색이 달라야 한다는 것이다. RGB거리1에서는 처음과 마지막은 고려하지 않았기 때문에 한번의 DP과정..
C++ 백준 1149 (RGB거리) 백준 1149 (RGB거리) https://www.acmicpc.net/problem/1149 1149번: RGB거리 첫째 줄에 집의 수 N(2 ≤ N ≤ 1,000)이 주어진다. 둘째 줄부터 N개의 줄에는 각 집을 빨강, 초록, 파랑으로 칠하는 비용이 1번 집부터 한 줄에 하나씩 주어진다. 집을 칠하는 비용은 1,000보다 작거나 www.acmicpc.net 전형적인 DP문제이다. 설명 문제를 보면 다음단계의 집색깔은 전단계의 집색깔과 같을 수 없다. 한단계 한단계 나아가며 현재단계에서의 optimal solution은 전단계의 optimal solution과 관계가 있다. 이 말은 dynamic programming을 통해 이문제를 해결할 수 있다는 것이다. 예를 들면 현재 네번째 집의 색이 R이라면..
C++ 백준 1948 (임계경로) 백준 1948 (임계경로) https://www.acmicpc.net/problem/1948 1948번: 임계경로 첫째 줄에 도시의 개수 n(1 ≤ n ≤ 10,000)이 주어지고 둘째 줄에는 도로의 개수 m(1 ≤ m ≤ 100,000)이 주어진다. 그리고 셋째 줄부터 m+2줄까지 다음과 같은 도로의 정보가 주어진다. 처음에는 도로의 www.acmicpc.net 설명 이 문제는 임계경로의 길이와 그 경로들에 채택되었던 간선의 개수를 세는 문제이다. 임계경로의 길이를 구하는 방법은 여기(링크)에 있다. 임계경로는 하나만 존재하는 것이 아니라 여러개 존재할 수도있다. 때문에 이 임계경로들에 채택되었던 간선의 개수를 세는 방법은 꽤 어려웠다. 여러 방법을 통해 임계경로들에 채택되었던 간선의 개수를 셀 수 있..
임계경로(Critical Path) 알고리즘 임계경로(Critical Path) ! 본 글에서는 임계경로의 지나온 경로는 구하지 않고 임계경로의 길이만 구한다 ! 그래프에서 임계경로란 어떤 시작지점으로부터 끝지점까지의 최장경로를 의미한다. 보통 그래프에서 경로의 길이를 구하면 최소경로를 찾는 것이 대부분이었을 것이다. 최장거리를 구한다는 것은 무슨 의미가 있을까? 다음과 같은 그래프가 있다고 가정하자. 위 그래프는 앞서 위상정렬(링크)에서 사용했던 그래프이다. 각 노드를 일이라고 표현해보자. 또한 빨간색 숫자는 각일을 할때 걸리는 시간이다. 해당 노드의 일을 끝내야 다음노드의 일을 끝낼 수 있다. 그렇다면 모든 일이 종료될때 까지의 최소시간은 무엇일까? 아무리 빠른 경로로 가서 마지막일을 끝내봤자 다른일이 끝나지 않았다면 의미가 없을 것이다. 이때..
C++ 백준 1647 (도시 분할 계획) 백준 1647 (도시 분할 계획) https://www.acmicpc.net/problem/1647 1647번: 도시 분할 계획 첫째 줄에 집의 개수 N, 길의 개수 M이 주어진다. N은 2이상 100,000이하인 정수이고, M은 1이상 1,000,000이하인 정수이다. 그 다음 줄부터 M줄에 걸쳐 길의 정보가 A B C 세 개의 정수로 주어지는데 A번 www.acmicpc.net 설명 이 문제는 MST를 찾는 문제이다. MST를 찾기 위해 크루스칼 알고리즘을 사용해야하는데 이에 대한 자세한 설명은 여기(링크)에 있다. 연결되어있는 여러 도시를 가장 작은 MST 두개의 그룹으로 나누는 것이 문제의 목표이다. 때문에 주어진 그래프의 MST로 찾은 후에 찾은 MST중 가중치가 가장 큰 엣지만 제거한다면 문제..
크루스칼(Kruskal) 알고리즘 설명 크루스칼 알고리즘은 프림 알고리즘과 함께 그래프에서 MST(Minimum Spanning Tree)를 찾을 때 사용 되는 알고리즘이다. 알고리즘을 전개하는 과정에서 소속집단의 검색과 합병기능이 필요한데, 이를 위해 유니온파인드에 대한 선행 학습이 필요하다. 유니온 파인드(Union Find) 설명 유니온 파인드는 집합의 표현을 빠르게 구현하는 알고리즘이다. 예를 들어보자. 사람 P1, P2, P3, P4가 있다. 각 사람은 자신의 소속집단 C1, C2, C3, C4에 가입되어 있다고 가정하자. 1. C3에 속한 P seongmok.com 크루스칼 알고리즘은 사이클을 이루지 않고 크기가 작은 간선부터 탐색해 나아가는 방법을 사용한다. 이때, 사이클 생성 여부를 확인하기 위해 유니온 파인드를 사용한다...
플로이드-워셜(Floyd-Warshall) 알고리즘 플로이드-워셜 (Floyd-Warshall) 플로이드-워셜 (이하 플로이드)알고리즘은 그래프에서 최단거리를 찾을 때 사용하는 알고리즘이다. 그래프에서의 최단거리를 찾을 때 가장 대표적인 알고리즘은 다익스트라(링크) 알고리즘이다. 다익스트라 알고리즘은 특정 시작지점에서 모든 노드까지의 최소거리를 알고 싶을 때 사용했다. 즉 다익스트라를 이용하면 하나의 시작노드에서의 정보밖에 얻을 수 없다. 그렇다면 모든 노드를 시작지점으로 해서 각 노드까지의 최소거리를 모두 알고 싶다면 어떻게 할까? 가장 먼저 떠오르는 생각은 다익스트라 알고리즘을 V(정점의 개수)만큼 반복시키는 것이다. 다익스트라 알고리즘 설명에서 다익스트라의 시간복잡도는 O(E*logV)라고 했다. 이는 우선순위 큐를 바이너리 힙으로 구현했을 때의 이..
다익스트라(Dijkstra) 알고리즘 다익스트라 (Dijkstra) 다익스트라는 어떤 그래프에서 특정노드에서 특정노드까지의 최단거리를 구할때 쓰는 알고리즘이다. 바로 예시를 들어보자. 다음과 같은 그래프가 있다. 1번 노드에서 2번 노드로 가기위한 최소거리를 구할때 우리는 모든 엣지의 크기를 동시에 살피며 눈대중으로 찾을 것이다. 코딩을해서 찾는거보다 그냥 머리로찾는게 빠를거다. 그러나 노드의 개수가 많아지고 엣지의 개수가 많아지면 문제가 생긴다. 때문에 우리는 최단거리를 찾는 알고리즘을 통해 노드간의 최단거리를 찾아야 하는데 이에 대표적으로 사용되는 알고리즘이 바로 다익스트라이다. 설명 다익스트라는 BFS의 기본 틀에 우선순위 큐를 접목하여 구현할 수 있다. BFS에 대한 설명은 여기(링크)에 있당! 1번 노드에서 각 노드로 가기위한 최소..