본문 바로가기

c++61

[백준] 1912 - 연속합, C++ https://www.acmicpc.net/problem/1912 1912번: 연속합 첫째 줄에 정수 n(1 ≤ n ≤ 100,000)이 주어지고 둘째 줄에는 n개의 정수로 이루어진 수열이 주어진다. 수는 -1,000보다 크거나 같고, 1,000보다 작거나 같은 정수이다. www.acmicpc.net 본 문제는 분류상 DP로 나와 있지만 완전 탐색 문제라고 생각한다. 한 가지 주의해야 할 점은 최댓값을 비교할 때, 0보다 작은 경우가 있을 수 있으므로 충분히 큰 음의 값을 선언한다. a[i] > a[i-1] + a[i] 일 때, continue 그 외, a[i] = a[i-1] + a[i] 최댓값 출력 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 .. 2020. 1. 12.
[백준 14002] 가장 긴 증가하는 부분 수열 4, C++ https://www.acmicpc.net/problem/14002 14002번: 가장 긴 증가하는 부분 수열 4 수열 A가 주어졌을 때, 가장 긴 증가하는 부분 수열을 구하는 프로그램을 작성하시오. 예를 들어, 수열 A = {10, 20, 10, 30, 20, 50} 인 경우에 가장 긴 증가하는 부분 수열은 A = {10, 20, 10, 30, 20, 50} 이고, 길이는 4이다. www.acmicpc.net 본 문제는 가장 긴 증가하는 부분 수열과 비슷한 문제다. (때문에 자세한 설명은 생략한다.) 가장 긴 증가하는 부분 수열의 길이를 출력하는 것은 동일하나, 가장 긴 증가하는 부분 수열을 출력해야 하는 문제다. 따라서, 점화식을 계산할 때 따로 이전 배열만 저장하면 된다. Bottom-up 1 2 .. 2020. 1. 12.
[백준 11053] 가장 긴 증가하는 부분 수열, C++ https://www.acmicpc.net/problem/11053 11053번: 가장 긴 증가하는 부분 수열 수열 A가 주어졌을 때, 가장 긴 증가하는 부분 수열을 구하는 프로그램을 작성하시오. 예를 들어, 수열 A = {10, 20, 10, 30, 20, 50} 인 경우에 가장 긴 증가하는 부분 수열은 A = {10, 20, 10, 30, 20, 50} 이고, 길이는 4이다. www.acmicpc.net 본 문제는 수열 A가 주어졌을 때, 가장 긴 증가하는 부분 수열을 구하는 문제다. 수열의 값을 저장하는 배열 a, 긴 부분 수열의 길이를 저장하는 배열 b라고 했을 때, a[i]의 이전 배열의 값과 비교하면서, d[i] 이전의 배열의 값에 1을 더한 값과 비교를 해야한다. 즉, 1 ≤ j < i 일때.. 2020. 1. 12.
[백준] 2193 - 이친수, C++ https://www.acmicpc.net/problem/2193 2193번: 이친수 0과 1로만 이루어진 수를 이진수라 한다. 이러한 이진수 중 특별한 성질을 갖는 것들이 있는데, 이들을 이친수(pinary number)라 한다. 이친수는 다음의 성질을 만족한다. 이친수는 0으로 시작하지 않는다. 이친수에서는 1이 두 번 연속으로 나타나지 않는다. 즉, 11을 부분 문자열로 갖지 않는다. 예를 들면 1, 10, 100, 101, 1000, 1001 등이 이친수가 된다. 하지만 0010101이나 101101은 각각 1, 2번 규칙에 위배되 www.acmicpc.net 본 문제는 0과 1로만 이루어진 수 중, 0으로 시작하지 않고, 1이 두 번 연속으로 나타나지 않는 수를 구하는 문제다. 큰 문제를 작은 .. 2020. 1. 11.
[백준] 10844 - 쉬운 계단 수, C++ https://www.acmicpc.net/problem/10844 10844번: 쉬운 계단 수 첫째 줄에 정답을 1,000,000,000으로 나눈 나머지를 출력한다. www.acmicpc.net 본 문제는 인접한 모든 자릿수의 차이가 1이 나는 수를 계단 수의 경우의 수를 구하는 문제다. 큰 문제를 작은 문제에서 구할 수 있기 때문에 DP로 풀 수 있다. i자리 수 중 j로 끝나는 경우의 수는 i-1자리 수 중 j+1, j-1의 경우의 수를 더한 값이다. 그러나 끝자리가 0인 경우는 1, 9인 경우는 8 밖에 없다. 따라서, 점화식을 d[i][j] = d[i-1][j+1] + d[i-1][j-1]로 정의하고, d[i][0] = d[i-1][1], d[i][9] = d[i-1][8]로 예외 처리를 하면 .. 2020. 1. 11.
[백준 15990] 1, 2, 3 더하기 5, C++ https://www.acmicpc.net/problem/15990 15990번: 1, 2, 3 더하기 5 각 테스트 케이스마다, n을 1, 2, 3의 합으로 나타내는 방법의 수를 1,000,000,009로 나눈 나머지를 출력한다. www.acmicpc.net 본 문제는 입력된 숫자를 1, 2, 3의 합으로 표현할 수 있는 경우의 수를 구하는 문제다. 예를 들어 7이 입력되었을 때, (합이 6이 되는 경우의 수), (합이 5가 되는 경우의 수), (합이 4가 되는 경우의 수)에 1, 2, 3을 더해서 구할 수 있다. 동일한 계산을 여러 번 해야 하며, 큰 문제를 작은 문제로 해결할 수 있기 때문에 DP로 문제를 해결할 수 있다. 문제의 조건 중 같은 수를 두 번 이상 연속해서 사용하면 안 되기 때문에, .. 2020. 1. 11.