본문 바로가기

전체 글

(84)
C++ 백준 14003 (가장 긴 증가하는 부분수열5) 백준 14003 (가장 긴 증가하는 부분수열5) https://www.acmicpc.net/problem/14003 14003번: 가장 긴 증가하는 부분 수열 5 첫째 줄에 수열 A의 크기 N (1 ≤ N ≤ 1,000,000)이 주어진다. 둘째 줄에는 수열 A를 이루고 있는 Ai가 주어진다. (-1,000,000,000 ≤ Ai ≤ 1,000,000,000) www.acmicpc.net LIS의 길이와 수열을 O(N*logN)안에 해결해야 하는 문제이다. LIS에 대한 기본이해와 O(N^2)의 시간으로 길이와 수열을 찾는 법, 그리고 O(N*logN)의 시간으로 LIS의 길이만을 찾는 방법은 아래에 있으니 반드시 모두 이해하고 이 글을 읽도록 한다. 1. LIS의 길이를 O(N^2)으로 구하는 방법 :..
C++ 백준 14002 (가장 긴 증가하는 부분수열4) 백준 14002 (가장 긴 증가하는 부분수열4) https://www.acmicpc.net/problem/14002 14002번: 가장 긴 증가하는 부분 수열 4 수열 A가 주어졌을 때, 가장 긴 증가하는 부분 수열을 구하는 프로그램을 작성하시오. 예를 들어, 수열 A = {10, 20, 10, 30, 20, 50} 인 경우에 가장 긴 증가하는 부분 수열은 A = {10, 20, 10, 30, 20, 50} 이 www.acmicpc.net 이 문제는 LIS의 길이 뿐만 아니라 LIS수열 중 하나를 출력하는 문제이다. 이 문제를 풀기에 앞서 LIS의 기본특성과 그 길이를 구하는 방법을 알아야 한다. 1. LIS의 길이를 O(N^2)으로 구하는 방법 : 여기(링크) 2. LIS의 길이를 O(N*log(N))..
LIS(Longest Increasing Subsequence - 최장 증가 수열) 알고리즘 (2) LIS(Longest Increasing Subsequence - 최장 증가 수열) (2) https://www.acmicpc.net/problem/12015 12015번: 가장 긴 증가하는 부분 수열 2 첫째 줄에 수열 A의 크기 N (1 ≤ N ≤ 1,000,000)이 주어진다. 둘째 줄에는 수열 A를 이루고 있는 Ai가 주어진다. (1 ≤ Ai ≤ 1,000,000) www.acmicpc.net !본 글에서는 최장 증가 수열의 길이만 구한다. 수열에 포함된 수는 다양한 방법을 통해 얻을 수 있다! 가장 긴 증가하는 부분수열(이하 LIS)의 길이를 찾기위한 기본적인 알고리즘 설명은 여기(링크) 있다. 이전글에서 LIS의 길이를 구하기 위해 O(N^2)만큼의 시간이 소요된다고 했었다. 본 글에서는 이를..
LIS(Longest Increasing Subsequence - 최장 증가 수열) 알고리즘 (1) LIS(Longest Increasing Subsequence - 최장 증가 수열) (1) https://www.acmicpc.net/problem/11053 11053번: 가장 긴 증가하는 부분 수열 수열 A가 주어졌을 때, 가장 긴 증가하는 부분 수열을 구하는 프로그램을 작성하시오. 예를 들어, 수열 A = {10, 20, 10, 30, 20, 50} 인 경우에 가장 긴 증가하는 부분 수열은 A = {10, 20, 10, 30, 20, 50} 이 www.acmicpc.net !본 글에서는 최장 증가 수열의 길이만 구한다! 또한 본글에서 설명하는 알고리즘의 시간복잡도는 O(N^2)이므로 매우 느리다. 크기가 작은 배열에서 간단한 아이디어로 구현을 하고싶을 때 사용하기 바람. 1. LIS의 길이와 수열을..
C++ 백준 1562 (계단 수) 백준 1562 (계단 수) https://www.acmicpc.net/problem/1562 1562번: 계단 수 첫째 줄에 정답을 1,000,000,000으로 나눈 나머지를 출력한다. www.acmicpc.net DP와 재귀에 비트마스크 연산을 사용하여 풀 수 있는 문제이다. 때문에 이 문제를 해결하기 위해선 DP, 재귀호출, 비트마스크 연산에 대한 이해가 필요하다. 설명 계단 수의 기본적인 아이디어는 다음과 같다. 시작숫자를 특정 숫자로 고정한 뒤, 재귀호출을 통해 이어나아갈 수 있는 숫자를 붙여 입력 N의 길이가 되면 멈추는 방식이다. 그러나 이 문제는 한 가지 조건이 더 있다. 0~9까지 모든 숫자가 포함되어야 한다는 것이다. 0~9까지 모든 숫자가 있는지 없는지를 판단한다.. 있는지 없는지.. ..
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 설명 이 문제는 임계경로의 길이와 그 경로들에 채택되었던 간선의 개수를 세는 문제이다. 임계경로의 길이를 구하는 방법은 여기(링크)에 있다. 임계경로는 하나만 존재하는 것이 아니라 여러개 존재할 수도있다. 때문에 이 임계경로들에 채택되었던 간선의 개수를 세는 방법은 꽤 어려웠다. 여러 방법을 통해 임계경로들에 채택되었던 간선의 개수를 셀 수 있..