총 10분 중 11분
2001
시즌 2개, 그리고 영화
시즌 2:
5화
“아일랜드”
출연: 이나영, 김민준, 김민정, 현빈
장르: 애초에 역경을 딛고 이룩하는 숭고한 사랑이란 없다. 그 역경 자체가 사랑이다.
프로그램 특징: 그 곳에서 살아남는 사랑이 어떤 모습으로 걸어오는지 기다려 보고 싶다.
장르: 애초에 역경을 딛고 이룩하는 숭고한 사랑이란 없다. 그 역경 자체가 사랑이다.
프로그램 특징: 그 곳에서 살아남는 사랑이 어떤 모습으로 걸어오는지 기다려 보고 싶다.
회차
-
[JAVA][BOJ 1256] 조합: 사전 찾기0515분문제링크문제 파악N개의 'a', M개의 'z'로 사전을 만들었다. 알파벳 순서로 수록된 사전에서 K번째 문자열 구하기사전에 있는 수가 K보다 작으면 -1 반환N개의 'a', M개의 'z', K번째 문자열1 ≤ N, M ≤ 1001 ≤ K ≤ 1,000,000,000접근 방법각 자리 수까지 만들 수 있는 문자열 개수 중복한 문자를 가지기 때문에 만들 수 있는 문자열의 개수는 N+M개 중 N개 또는 M개를 택하는 것과 같다.순열과 똑같이 전체 중에서 칸막이를 넣는다고 생각하면 된다.그리고 순열의 nCr = n-1 C r-1 + n-1 C r 을 이용하면 DP가 된다. DP부문 문제가 해결된 상황에서 마지막 데이터의 선택 여부에 따른 경우의 수 계산하는 것이다.DP[5][3] = DP[4][2] + DP[..
-
[백준 12865][dp] 배낭: knapsack0630분드디어 기대하고 기대하던 배낭문제다. 이 문제를 만나고 나서야 DP의 의미를 이해할 수 있게 되었다. DP는 a, b, c, d가 있을 때 abc, abd, acd ... 이런 조합을 만드는 문제가 아니었다.a를 넣었을 때와 넣지 않았을 때 두 개로 나뉜 경우에 대해 각각이 b를 넣었을 때와 넣지 않았을 때로 나누는 방식으로 풀었어야 했다. 헐랭~ https://youtu.be/rhda6lR5kyQ?si=wVKtxIhe4A9wsj81DP는 초깃값 설정이 중요하다. 우리가 구하고자 하는 값은 가치의 최댓값이고, 입력값은 항목의 개수와 각 항목당 무게와 가치가 주어진다. dp의 data는 value 의 sum이다. 가질 수 있는 value의 최대값을 구하는 문제이므로 n 번째 항목까지의 value sum을 ..
-
[프로그래머스][dp] 땅따먹기0626분프로그래머스 알고리즘 강좌가 dp 이해에 도움이 됐다는 글을 보고 '땅따먹기'를 시도했다. 직접 짜보고 dp 코드와 비교하니까 dp의 느낌이 확 와닿는다. dp는 모든 경우의 수를 확인하는데, 각 요소가 있고, 없고에 따라 경우를 만든다. 문제와 함께 보자 문제ㅎ. 하지만 나는 어제 dp를 정리해 놓고도 전혀 떠오르지 않아서 풀리는 대로 풀었다. (이해가 덜 됐다ㅜ)내 풀이 방법1. 현재 index(j)를 이전 max의 index와 비교해 같지 않은 경우에만 들어간다. - if ( i == 0 ) 인 예외를 주는 데 시간이 오래 걸렸다. 다시 생각해 보니 첫 열은 index가 뭐든 관계없으니까 preindex 처음 선언할 때 preindex = -1; 했으면 됐겠다. 2. index가 같지 않은 경우..
-
[백준 1106] DP 동적프로그래밍0625분동적 프로그래밍(Dynamic programming)이란 과거에 사용한 값을 중복해서 사용하는 경우에서 사용할 알고리즘을 말한다. 대표적으로 배낭 문제, 피보나치 수열이 있다. 이전에 구해놓은 값을 재사용하기 때문에 재귀함수를 이용해야 한다. 재귀함수를 naive하게 사용하게 되면 시간, 공간복잡도가 폭발적으로 증가한다.부분 문제에 대한 값을 미리 계산해놓고 한 번에 이용하는 것이 시공간 관점에서 효율적이다. 따라서 Memoization(메모이제이션)을 활용한다.같은 문제의 풀이를 재활용하는 방식인데, 재귀의 방법이 있다. 부분 문제에 대한 경우의 수를 모두 구할 건데, 이 때 재귀를 사용한다. 부분 문제를 넣고(1), 빼고(0) 에 대한 경우의 수를 구하는 것이다.dp의 memoization은 하향식으..
Algorithm/Dynamic Programming
[JAVA][BOJ 1256] 조합: 사전 찾기
문제 파악
N개의 'a', M개의 'z'로 사전을 만들었다. 알파벳 순서로 수록된 사전에서 K번째 문자열 구하기
- 사전에 있는 수가 K보다 작으면 -1 반환
N개의 'a', M개의 'z', K번째 문자열
- 1 ≤ N, M ≤ 100
- 1 ≤ K ≤ 1,000,000,000
접근 방법
각 자리 수까지 만들 수 있는 문자열 개수 < K, K랑 가장 근접한 개수에서 노가다로 푸는게 생각이 났다.
중복한 문자를 가지기 때문에 만들 수 있는 문자열의 개수는 N+M개 중 N개 또는 M개를 택하는 것과 같다.
순열과 똑같이 전체 중에서 칸막이를 넣는다고 생각하면 된다.
그리고 순열의 nCr = n-1 C r-1 + n-1 C r 을 이용하면 DP가 된다.
DP
부문 문제가 해결된 상황에서 마지막 데이터의 선택 여부에 따른 경우의 수 계산하는 것이다.
DP[5][3] = DP[4][2] + DP[4][3]
- 5개 중 4개를 이미 선택 완료한 데이터라 가정
- 5개 중 3개를 선택 = 4개 중 2개 선택 + 4개 중 3개 선택
DP[n+m][n] = T = 남아있는 문자들로 만들 수 있는 경우의 수
T >= K: 현재 자리 문자를 a로 선택
T < K: 현재 자리 문자를 z로 선택하고, K = K - T 로 업데이트
- K = K - T 로 업데이트 하는 이유는, 만약 DP[][] = 3이고, K(4)번째일 때, a를 놓았을 때 경우의 수가 3개 생긴다는 뜻이므로 a로 놓았을 경우 3개를 K에서 빼주고 z로 놓는다.
코드 구현
import java.util.*;
public class Main {
public static void main(String[] args) {
Scanner sc = new Scanner(System.in);
int n = sc.nextInt();
int m = sc.nextInt();
int k = sc.nextInt();
// DP 테이블 초기화
int[][] DP = new int[202][202];
for (int i = 0; i <= 200; i++) {
for (int j = 0; j <= i; j++) {
if (j == 0 || j == i) DP[i][j] = 1;
else {
DP[i][j] = DP[i - 1][j - 1] + DP[i - 1][j];
// k보다 큰 범위는 볼 필요없기 때문에 범위의 최댓값 입력
if (DP[i][j] > 1000000000) DP[i][j] = 1000000001;
}
}
}
// 주어진 K가 만들 수 있는 조합 수보다 크면 불가능
if (DP[n + m][m] < k) {
System.out.println("-1");
return;
}
// 결과를 담을 StringBuilder
StringBuilder sb = new StringBuilder();
// n, m이 0이 될 때까지 반복
while (!(n == 0 && m == 0)) {
if (n > 0 && DP[n - 1 + m][m] >= k) {
sb.append("a");
n--;
} else {
if (n > 0) k -= DP[n - 1 + m][m];
sb.append("z");
m--;
}
}
// 최종 결과 출력
System.out.println(sb.toString());
}
}
배우게 된 점
DP가 부분 문제의 마지막 순간을 선택한다는 걸 순열의 n-1Cr-1 + n-1Cr로 이어서 생각할 수도 있다는 것을 배웠다 .
질문
'Algorithm > Dynamic Programming' 카테고리의 다른 글
[백준 12865][dp] 배낭: knapsack (2) | 2024.06.30 |
---|---|
[프로그래머스][dp] 땅따먹기 (0) | 2024.06.26 |
[백준 1106] DP 동적프로그래밍 (0) | 2024.06.25 |
2025:05:15
Algorithm/Dynamic Programming
[JAVA][BOJ 1256] 조합: 사전 찾기