본문 바로가기

728x90

다이나믹

(12)
[백준] 12865번 평범한 배낭 [Python] - 다이나믹 N개의 물건과 각 물건의 무게 W, 가치 V가 주어질 때, 최대 무게 K 내에서 가치의 합이 최대가 되는 그 최댓값을 구하는 문제 더보기 문제 이 문제는 아주 평범한 배낭에 관한 문제이다. 한 달 후면 국가의 부름을 받게 되는 준서는 여행을 가려고 한다. 세상과의 단절을 슬퍼하며 최대한 즐기기 위한 여행이기 때문에, 가지고 다닐 배낭 또한 최대한 가치 있게 싸려고 한다. 준서가 여행에 필요하다고 생각하는 N개의 물건이 있다. 각 물건은 무게 W와 가치 V를 가지는데, 해당 물건을 배낭에 넣어서 가면 준서가 V만큼 즐길 수 있다. 아직 행군을 해본 적이 없는 준서는 최대 K만큼의 무게만을 넣을 수 있는 배낭만 들고 다닐 수 있다. 준서가 최대한 즐거운 여행을 하기 위해 배낭에 넣을 수 있는 물건들의 가치의..
[백준] 9251번 LCS [Python] - 다이나믹, 문자열 LCS$($Longest Common Subsequence, 최장 공통 부분 수열$)$문제 최장 공통 부분 수열 더보기 문제 LCS$($Longest Common Subsequence, 최장 공통 부분 수열$)$문제는 두 수열이 주어졌을 때, 모두의 부분 수열이 되는 수열 중 가장 긴 것을 찾는 문제이다. 예를 들어, ACAYKP와 CAPCAK의 LCS는 ACAK가 된다. 입력 첫째 줄과 둘째 줄에 두 문자열이 주어진다. 문자열은 알파벳 대문자로만 이루어져 있으며, 최대 1000글자로 이루어져 있다. 출력 첫째 줄에 입력으로 주어진 두 문자열의 LCS의 길이를 출력한다. https://www.acmicpc.net/problem/9251 한 단어의 철자를 순서대로 다른 단어의 철자와 비교하면서 같은 철자가..
[백준] 2096번 내려가기 [Python] - 다이나믹 N행 3열에 0 이상 9 이하의 숫자가 적혀 있다. 첫번째 줄부터 내려가면서 숫자를 하나씩 선택해서 총 N개의 숫자를 모두 더하면 점수가 된다. 아래 그림처럼 현재 선택 된 곳이 ☆이면 그 아래 줄에서 바로 아래거나 그 옆인 곳만 선택할 수 있다. 위 조건을 만족하면서 최대/ 최소 점수를 구하는 문제이다. 더보기 문제 N줄에 0 이상 9 이하의 숫자가 세 개씩 적혀 있다. 내려가기 게임을 하고 있는데, 이 게임은 첫 줄에서 시작해서 마지막 줄에서 끝나게 되는 놀이이다. 먼저 처음에 적혀 있는 세 개의 숫자 중에서 하나를 골라서 시작하게 된다. 그리고 다음 줄로 내려가는데, 다음 줄로 내려갈 때에는 다음과 같은 제약 조건이 있다. 바로 아래의 수로 넘어가거나, 아니면 바로 아래의 수와 붙어 있는 수로만 이..
[백준] 11660번 구간 합 구하기 5 [Python] - 다이나믹, 누적 합 N×N개의 수가 N×N 크기의 표에 채워져 있다. $(x1, y1)$부터 $(x2, y2)$까지 합을 구하는 문제. $(x, y)$는 x행 y열을 의미한다. 1차원 수열의 구간 합 문제 https://savvy0402.tistory.com/216 위 문제와 비슷하지만 이번에는 2차원 수열의 구간 합을 구하는 문제라고 보면 된다. 더보기 문제 N×N개의 수가 N×N 크기의 표에 채워져 있다. $(x1, y1)$부터 $(x2, y2)$까지 합을 구하는 프로그램을 작성하시오. $(x, y)$는 x행 y열을 의미한다. 예를 들어, N = 4이고, 표가 아래와 같이 채워져 있는 경우를 살펴보자. 1 2 3 4 2 3 4 5 3 4 5 6 4 5 6 7 여기서 $(2, 2)$부터 $(3, 4)$까지 합을 구하면 3..
[백준] 9465번 스티커 [Python] - 다이나믹 2행 n열로 배치된 스티커 2n개에 각각 점수가 매겨졌다. 스티커를 떼어내면 상하좌우가 찢어져서 주변 스티커는 사용 못한다. 사용한 스티커의 점수 합이 최대가 되는 그 최댓값을 구하는 문제 더보기 문제 상근이의 여동생 상냥이는 문방구에서 스티커 2n개를 구매했다. 스티커는 그림 $(a)$와 같이 2행 n열로 배치되어 있다. 상냥이는 스티커를 이용해 책상을 꾸미려고 한다. 상냥이가 구매한 스티커의 품질은 매우 좋지 않다. 스티커 한 장을 떼면, 그 스티커와 변을 공유하는 스티커는 모두 찢어져서 사용할 수 없게 된다. 즉, 뗀 스티커의 왼쪽, 오른쪽, 위, 아래에 있는 스티커는 사용할 수 없게 된다. 모든 스티커를 붙일 수 없게된 상냥이는 각 스티커에 점수를 매기고, 점수의 합이 최대가 되게 스티커를 떼어내..
[백준] 1932번 정수 삼각형 [Python] - 다이나믹 아래 그림 같은 정수 삼각형이 주어질 때, 7 3 8 8 1 0 2 7 4 4 4 5 2 6 5 맨 위에 있는 꼭짓점부터 바로 아래에 있는 숫자 중 하나$($아래층의 대각선 왼쪽 또는 대각선 오른쪽$)$를 골라서 내려올 때, 합이 최대가 되는 경로의 그 합을 구하는 문제 더보기 문제 7 3 8 8 1 0 2 7 4 4 4 5 2 6 5 위 그림은 크기가 5인 정수 삼각형의 한 모습이다. 맨 위층 7부터 시작해서 아래에 있는 수 중 하나를 선택하여 아래층으로 내려올 때, 이제까지 선택된 수의 합이 최대가 되는 경로를 구하는 프로그램을 작성하라. 아래층에 있는 수는 현재 층에서 선택된 수의 대각선 왼쪽 또는 대각선 오른쪽에 있는 것 중에서만 선택할 수 있다. 삼각형의 크기는 1 이상 500 이하이다. 삼각형..
[백준] 1149번 RGB거리 [Python] - 다이나믹 N개의 집이 일렬로 있고, 빨강, 초록, 파랑 이 세가지로 칠하는 경우 각각 집마다 색마다 비용이 주어졌다. N은 2 이상 1000이하이고, 비용은 1000 이하 자연수이다. 이웃 집과 다른 색으로 N개의 집을 모두 색칠할 때, 비용 합산의 최솟값을 구하는 문제 더보기 문제 RGB거리에는 집이 N개 있다. 거리는 선분으로 나타낼 수 있고, 1번 집부터 N번 집이 순서대로 있다. 집은 빨강, 초록, 파랑 중 하나의 색으로 칠해야 한다. 각각의 집을 빨강, 초록, 파랑으로 칠하는 비용이 주어졌을 때, 아래 규칙을 만족하면서 모든 집을 칠하는 비용의 최솟값을 구해보자. 1번 집의 색은 2번 집의 색과 같지 않아야 한다. N번 집의 색은 N-1번 집의 색과 같지 않아야 한다. i$(2 ≤ i ≤ N-1)$번 집..
[백준] 11053번 가장 긴 증가하는 부분 수열 [Python] - 다이나믹, LIS 어떤 임의의 수열이 주어질 때, 이 수열에서 몇 개의 수들을 제거해서 부분수열을 만들 수 있다. 이때 만들어진 부분수열 중 오름차순으로 정렬된 가장 긴 수열을 최장 증가 부분 수열$($LIS: Longest Increasing Subsequence$)$이라 한다. LIS의 길이를 구하는 문제 더보기 문제 수열 A가 주어졌을 때, 가장 긴 증가하는 부분 수열을 구하는 프로그램을 작성하시오. 예를 들어, 수열 A = {10, 20, 10, 30, 20, 50} 인 경우에 가장 긴 증가하는 부분 수열은 A = {10, 20, 10, 30, 20, 50} 이고, 길이는 4이다. 입력 첫째 줄에 수열 A의 크기 N $(1 ≤ N ≤ 1,000)$이 주어진다. 둘째 줄에는 수열 A를 이루고 있는 $A_i$가 주어진..
[백준] 11727번 2xn 타일링 2 [Python] - 다이나믹 2×n 직사각형을 1×2, 2×1과 2×2 타일로 채우는 방법의 수를 구하는 문제 더보기 문제 2×n 직사각형을 1×2, 2×1과 2×2 타일로 채우는 방법의 수를 구하는 프로그램을 작성하시오. 아래 그림은 2×17 직사각형을 채운 한가지 예이다. 입력 첫째 줄에 n이 주어진다. $(1 ≤ n ≤ 1,000)$ 출력 첫째 줄에 2×n 크기의 직사각형을 채우는 방법의 수를 10,007로 나눈 나머지를 출력한다. https://www.acmicpc.net/problem/11727 2x$(n-1)$개 타일이 채워진 경우 2×1 타일을 추가하면 2xn 직사각형을 타일로 채우게 되고, 2x$(n-2)$개 타일이 채워진 경우 1x2 타일 2개 또는 2×2 타일을 추가하면 2xn 직사각형을 타일로 채우게 됩니다. 위..
[백준] 2775번 부녀회장이 될테야 [Python] - 다이나믹 k층에 n호에는 몇 명이 살고 있는지 알아내는 문제 0층부터 있고 각층에는 1호부터 있으며, 0층의 i호에는 i명이 산다. a층의 b호에 살려면 자신의 아래$($a-1$)$층의 1호부터 b호까지 사람들의 수의 합만큼 산다. 더보기 문제 평소 반상회에 참석하는 것을 좋아하는 주희는 이번 기회에 부녀회장이 되고 싶어 각 층의 사람들을 불러 모아 반상회를 주최하려고 한다. 이 아파트에 거주를 하려면 조건이 있는데, “a층의 b호에 살려면 자신의 아래$($a-1$)$층의 1호부터 b호까지 사람들의 수의 합만큼 사람들을 데려와 살아야 한다” 는 계약 조항을 꼭 지키고 들어와야 한다. 아파트에 비어있는 집은 없고 모든 거주민들이 이 계약 조건을 지키고 왔다고 가정했을 때, 주어지는 양의 정수 k와 n에 대해 k층에..
[백준] 25706번 자전거 묘기 [Python] - 다이나믹 자전거를 타고 점프대를 지나면 그 높이만큼 칸을 건너 뛴다. 1번칸부터 N번칸 까지 자전거를 타고 출발할 때, 지나가게 되는 칸의 수를 구하는 문제 더보기 문제 길이가 N미터인 직선 자전거 도로가 있다. 도로는 길이가 1미터인 N개의 칸으로 구분되어 있고, 가장 왼쪽에 있는 칸부터 순서대로 1번 칸, 2번 칸, …, N번 칸이다. 도로의 각 칸에는 점프대가 설치되어 있을 수 있다. i$($1 ≤ i ≤ N$)$번 칸에 설치된 점프대의 높이를 hi라고 하자. 높이가 hi인 점프대를 밟으면 그 어떤 요인과도 관계없이 다음 hi칸 위를 비행한 뒤 그다음 칸에 착지한다. 다음 예시를 확인해 보자. 자전거를 타고 1번 칸에서 출발해 앞으로 달리면 다음과 같은 일들이 순서대로 일어난다. 1번 칸에 점프대가 없으므로..
[백준] 14494번 다이나믹이 뭐예요? [Python] - 다이나믹 (1,1)에서 (n,m)까지 →, ↓, ↘의 세 방향만 사용해서 한 번에 한 칸씩 이동할 떄, 경우의 수 더보기 문제 안녕하세요~ 저는 오늘 다이나믹 프로그래밍$($동적 계획법$)$을 설명하기 위해 등장한 욱제예요! 다이나믹은 이름이 엄청 거창하지만 사실 이름에 비해 개념은 간단하답니다. 다이나믹의 기본 아이디어는 바로 이전에 계산한 값을 사용해서 $($= 이미 계산된 값을 사용해서, 어려운 말로 메모이제이션 한다고 해요$)$ 반복되는 똑같은 연산 횟수를 줄이는 거예요. 예를 들어서, 5번째 피보나치 수열을 구하는 F$($5$)$의 동작 과정을 살펴볼게요. 같은 함수가 불필요하게 많이 호출되는 것을 볼 수 있죠? F$($2$)$와 F$($3$)$을 미리 구해놓고 F$($4$)$를 구할 땐 미리 구해둔 F..