알고리즘

    백준 알고리즘 9465(DP)

    백준 알고리즘 9465 문제: 상근이의 여동생 상냥이는 문방구에서 스티커 2n개를 구매했다. 스티커는 그림 (a)와 같이 2행 n열로 배치되어 있다. 상냥이는 스티커를 이용해 책상을 꾸미려고 한다. 상냥이가 구매한 스티커의 품질은 매우 좋지 않다. 스티커 한 장을 떼면, 그 스티커와 변을 공유하는 스티커는 모두 찢어져서 사용할 수 없게 된다. 즉, 뗀 스티커의 왼쪽, 오른쪽, 위, 아래에 있는 스티커는 사용할 수 없게 된다. 모든 스티커를 붙일 수 없게된 상냥이는 각 스티커에 점수를 매기고, 점수의 합이 최대가 되게 스티커를 떼어내려고 한다. 먼저, 그림 (b)와 같이 각 스티커에 점수를 매겼다. 상냥이가 뗄 수 있는 스티커의 점수의 최댓값을 구하는 프로그램을 작성하시오. 즉, 2n개의 스티커 중에서 점..

    백준 알고리즘 2193

    백준 알고리즘 2193 문제: 이친수 0과 1로만 이루어진 수를 이진수라 한다. 이러한 이진수 중 특별한 성질을 갖는 것들이 있는데, 이들을 이친수(pinary number)라 한다. 이친수는 다음의 성질을 만족한다. 이친수는 0으로 시작하지 않는다. 이친수에서는 1이 두 번 연속으로 나타나지 않는다. 즉, 11을 부분 문자열로 갖지 않는다. 예를 들면 1, 10, 100, 101, 1000, 1001 등이 이친수가 된다. 하지만 0010101이나 101101은 각각 1, 2번 규칙에 위배되므로 이친수가 아니다. N(1 ≤ N ≤ 90)이 주어졌을 때, N자리 이친수의 개수를 구하는 프로그램을 작성하시오. 입력: 첫째 줄에 N이 주어진다. 출력: 첫째 줄에 N자리 이친수의 개수를 출력한다. 풀이: 쉬운 ..

    백준알고리즘 11057 (DP)

    백준 알고리즘 11057번 문제: 오르막 수 오르막 수는 수의 자리가 오름차순을 이루는 수를 말한다. 이때, 인접한 수가 같아도 오름차순으로 친다. 예를 들어, 2234와 3678, 11119는 오르막 수이지만, 2232, 3676, 91111은 오르막 수가 아니다. 수의 길이 N이 주어졌을 때, 오르막 수의 개수를 구하는 프로그램을 작성하시오. 수는 0으로 시작할 수 있다. 입력: 첫째 줄에 N (1 ≤ N ≤ 1,000)이 주어진다. 출력: 첫째 줄에 길이가 N인 오르막 수의 개수를 10,007로 나눈 나머지를 출력한다. 풀이: 쉬운 계단 수와 비슷하게 풀이를 진행하면 된다. dp[n][i] : n을 자릿수, i를 1의 자리수로 생각하고 진행한다. (차원정하기) - 이걸 어떻게 생각할까 싶다. dp[..

    백준 알고리즘 10844번 (DP)

    백준 알고리즘 10844번 문제: 쉬운 계단 수 45656이란 수를 보자. 이 수는 인접한 모든 자리수의 차이가 1이 난다. 이런 수를 계단 수라고 한다. 세준이는 수의 길이가 N인 계단 수가 몇 개 있는지 궁금해졌다. N이 주어질 때, 길이가 N인 계단 수가 총 몇 개 있는지 구하는 프로그램을 작성하시오. (0으로 시작하는 수는 없다.) 입력: 첫째 줄에 N이 주어진다. N은 1보다 크거나 같고, 100보다 작거나 같은 자연수이다. 출력: 첫째 줄에 정답을 1,000,000,000으로 나눈 나머지를 출력한다. 풀이: 그림을 그려보면 쉽게 풀 수 있다. 1번째줄 : 1 2 3 4 5 6 7 8 9 2번째줄 : 0 2 1 3 4 4 3 5 4 6 4 7 6 8 7 9 8 3번째줄: 1 배열 dp[n][i]..

    백준 알고리즘 9095 (DP)

    백준 알고리즘 9095 문제: 1,2,3 더하기 정수 4를 1, 2, 3의 합으로 나타내는 방법은 총 7가지가 있다. 합을 나타낼 때는 수를 1개 이상 사용해야 한다. 1+1+1+1 1+1+2 1+2+1 2+1+1 2+2 1+3 3+1 정수 n이 주어졌을 때, n을 1, 2, 3의 합으로 나타내는 방법의 수를 구하는 프로그램을 작성하시오. 입력: 첫째 줄에 테스트 케이스의 개수 T가 주어진다. 각 테스트 케이스는 한 줄로 이루어져 있고, 정수 n이 주어진다. n은 양수이며 11보다 작다. 풀이: 백준 알고리즘 1463, 11726과 비슷한 문제이다. 주어진 정수 n을 0으로 만들기 위해 사용 되는 방법은 -1, -2, -3 로 3가지이다. 블로그의 11726 번 풀이를 살펴보면, dp[i] = dp[i-..

    백준 알고리즘 - 1463(DP)

    백준 알고리즘 1463 문제: 정수 X에 사용할 수 있는 연산은 다음과 같이 세 가지 이다.X가 3으로 나누어 떨어지면, 3으로 나눈다.X가 2로 나누어 떨어지면, 2로 나눈다.1을 뺀다.정수 N이 주어졌을 때, 위와 같은 연산 세 개를 적절히 사용해서 1을 만들려고 한다. 연산을 사용하는 횟수의 최솟값을 출력하시오. 입력: 첫째 줄에 1보다 크거나 같고, 106보다 작거나 같은 정수 N이 주어진다. 풀이: Dp[i] = 1) Dp[i/3] + 1 2) Dp[i/2] + 1 3) Dp[i-1] + 1 (뒤 숫자 +1은 연산 횟수를 증가 시켜준다.) 1을 만들기 위해 사용되는 방법은 총 3가지로 3으로 나누거나 2로나누거나 1을 빼는 것이다. 만약 정수 10이 주어졌다면 1로 만드는 과정을 하기 위해 가장..

    백준알고리즘 - 11726 (DP)

    백준 알고리즘 11726 문제: 2×n 크기의 직사각형을 1×2, 2×1 타일로 채우는 방법의 수를 구하는 프로그램을 작성하시오. 아래 그림은 2×5 크기의 직사각형을 채운 한 가지 방법의 예이다. 입력: 첫째 줄에 n이 주어진다. (1 ≤ n ≤ 1,000) 출력: 첫째 줄에 2×n 크기의 직사각형을 채우는 방법의 수를 10,007로 나눈 나머지를 출력한다. 나름대로의 풀이(아닐수 있음): Dp[i] = Dp[i-2] + Dp[i-1] 그림을 보고 이해를 해보자. 사용 할 수 있는 타일은 총 2개다. 1 x 2 타일과 2 x 1 타일이다. 첫번째 그림을 유심히 보면 알 수 있는 것이 있는데 가로가 긴 타일(1 x 2)을 배치하면 그 아래는 무조건 가로가 긴 타일(1 x 2)이 와야함을 알 수 있다. 두..