Algorithm/DP 52

BOJ#1915 가장 큰 정사각형

BOJ#1915 가장 큰 정사각형 * 문제https://www.acmicpc.net/problem/1915 * 풀이카카오 모의 테스트에서 나온 문제와 동일합니다. 풀이 아이디어는 다음과 같습니다.검사 위치에서 인접한 3방향(위쪽, 왼쪽, 왼쪽위 대각선 )의 값을 검사하여검사 위치의 값을 최소값 + 1으로 갱신해줍니다. * 나의 코드https://github.com/stack07142/BOJ/blob/master/BOJ%231915/src/Main.java import java.io.BufferedReader; import java.io.IOException; import java.io.InputStreamReader; import java.util.StringTokenizer; public class M..

Algorithm/DP 2017.09.22

BOJ#1309 동물원

BOJ#1309 동물원 * 문제https://www.acmicpc.net/problem/1309 * 풀이N이 1일 때부터 3일때까지 그림을 직접 그려보면 규칙을 찾으실 수 있을겁니다. 점화식dp[row][0] = (dp[row - 1][0] + dp[row - 1][1] + dp[row - 1][2]) % MOD; dp[row][1] = (dp[row - 1][0] + dp[row - 1][2]) % MOD; dp[row][2] = (dp[row - 1][0] + dp[row - 1][1]) % MOD; * 나의 코드https://github.com/stack07142/BOJ/blob/master/BOJ%231309/src/Main.java import java.io.BufferedReader; impo..

Algorithm/DP 2017.09.15

BOJ#2096 내려가기

BOJ#2096 내려가기 * 문제https://www.acmicpc.net/problem/2096 * 풀이메모리 제한이 4MB 입니다. 저는 처음에 재귀 형식으로 풀었다가 바텀업 방식으로 다시 풀었습니다. 또한, [100001][3] 사이즈의 dp배열과 map 배열을 모두 제거하였습니다. 두가지 형태의 코드 모두 아래에 붙여놓았으니 참고하시면 좋겠습니다. * 나의 코드 https://github.com/stack07142/BOJ/blob/458582301c132e9a61af00c77068edac24669619/BOJ%232096/src/Main.java import java.io.BufferedReader; import java.io.IOException; import java.io.InputStream..

Algorithm/DP 2017.09.12

BOJ#2294 동전 2

BOJ#2294 동전 2 * 문제https://www.acmicpc.net/problem/2294 * 풀이dp 기본 문제입니다.solve 함수는 크게 3부분으로 구성되어 있습니다. dp 정의dp[coinSum] : 현재 동전의 합이 coinSum일 때, k가 되기 위해 추가해야 하는 동전의 최소 개수solve(coinSum) 함수 : dp[coinSum]을 반환하는 함수. 1. 기저 사례동전의 합이 k에 딱 맞는 경우, return 0동전의 합이 k에 맞지 않는 경우, return 매우 큰 수 if (coinSum == k) return 0; if (coinSum > k) return INF; 2. 메모이제이션 dp 배열의 값을 -1로 초기화 했습니다. 즉, dp[coinSum]이 -1인 경우 메모이제이..

Algorithm/DP 2017.09.12

BOJ#2698 인접한 비트의 개수

BOJ#2698 인접한 비트의 개수 * 문제https://www.acmicpc.net/problem/2698 * 풀이문제가 어려울 때는 동적계획법의 정의에 대해 다시 생각해봅시다. 1. 복잡한 문제를 간단한 여러 문제로 나누어 푸는 방법 (하위 문제들의 답을 저장한다, 메모이제이션) 2. dp정의와 점화식을 도출해보자 , 1. 복잡한 문제를 간단한 여러 문제로 나누어 푸는 방법 일단 복잡한 문제란 길이가 긴 수열이라는 뜻이고 (우리가 손으로 풀 수 없음)간단한 하위 문제란 길이가 짧은 수열이라는 것입니다. (우리가 손으로 충분히 풀 수 있음) 결국 짧은 길이의 수열에서 점점 길이를 증가시키면서 우리가 원하는 답을 구하면 되는 것입니다. 이 문제의 경우수열의 각 자리는 0 또는 1이므로 이를 힌트로 하여 ..

Algorithm/DP 2017.08.08

BOJ#5015 ls

BOJ#5015 ls * 문제https://www.acmicpc.net/problem/5015 * 풀이 재귀 형태로 풀었습니다. 입력 파라미터는 패턴 문자열 P의 index인 p와 검사할 문자열 S의 index인 s입니다. 반환값은 memoization값인 dp[p][s]이며, dp[p][s]는 P[p]와 S[s]를 비교한 결과(매칭 여부)를 의미합니다. dp[p][s] = TRUE(1) or FALSE(0)static int checkStringPattern(int p, int s) 일단 패턴은 와일드카드(*) 와 그 외 문자로 분류할 수 있습니다. 1. 와일드 카드(*)의 경우와일드카드는 어떤 문자의 0개 또는 그 이상에 해당하므로 아래의 3가지 경우로 나누어 탐색할 수 있습니다. 1) 0개에 해당하..

Algorithm/DP 2017.08.07

BOJ#1234 크리스마스 트리

BOJ#1234 크리스마스 트리 * 문제https://www.acmicpc.net/problem/1234 * 풀이dp[N][R][G][B] : 레벨 N에서 장난감이 R, G, B개 남아있을 때 경우의 수 각 레벨에서는 3가지 경우를 탐색합니다. 1) 장난감을 1가지 종류만 쓰는 경우2) 장난감을 2가지 종류를 쓰는 경우 (N % 2 == 0일때)3) 장난감을 3가지 종류를 쓰는 경우 (N % 3 == 0일때) 그리고 각 경우의 수를 구한 뒤 장난감들의 순서도 생각해주어야 합니다. 참고 링크 : https://namu.wiki/w/순열(수학)3. 같은 것이 있는 경우의 순열(동자 순열)[편집]n개 중에 r개를 중복없이 순서에 맞게 뽑는데, n개 중에 똑같은 것이 몇개 섞여있을 경우를 말한다. 예를들어 세 ..

Algorithm/DP 2017.07.12

BOJ#2167 2차원 배열의 합

BOJ#2167 2차원 배열의 합 * 문제https://www.acmicpc.net/problem/2167 * 풀이단순하게 for loop 2개로 (i, j) ~ (x, y) 원소들을 더해도 되지만계산량을 줄이기 위해서 아래와 같이 구현해보았습니다. 1. 입력을 받으면서 dp[row][col]를 계산해 놓는다.dp[row][col] : (row, 1) 부터 (row, col)까지의 합 2. K개의 쿼리를 입력 받는다. (i, j), (x, y) 3. 행 단위로 합을 구하고 sum 변수에 합산한다. for ( row = i ... x) { sum += dp[row][y] - dp[row][j - 1];} * 나의 코드https://github.com/stack07142/BOJ/blob/6ac31273349..

Algorithm/DP 2017.05.10

BOJ#1010 다리 놓기

BOJ#1010 다리 놓기 * 문제https://www.acmicpc.net/problem/1010 * 풀이풀이 #1. 조합이 문제는 단순히 M개의 사이트 중에서 N개를 고르는 경우의 수를 구하는 문제입니다. 조합 : mCnmCn = m! / {(m-n)! * n!} 풀이 #2. 동적계획법dp[N][M] : 사이트가 각각 N개, M개일 때, 주어진 조건에 맞게 다리를 건설할 수 있는 경우의 수dp[N][M] = dp[N-1][M-1] + dp[N-1][M-2] + ... + dp[N-1][N-1] * 나의 코드https://github.com/stack07142/BOJ/blob/d8bb015604a276ecd8643e16c9ae052c2c36a2fa/BOJ%231010_BuildBridge/src/Mai..

Algorithm/DP 2017.05.09

BOJ#9084 동전

BOJ#9084 동전 * 문제https://www.acmicpc.net/problem/9084 * 풀이참고한 블로그 : http://wootool.tistory.com/177http://blog.naver.com/PostView.nhn?blogId=occidere&logNo=220793012348http://heygyun.tistory.com/46 동적계획법의 개념(복잡한 문제를 여러 하위 문제로 나누어 푼다)을 잘 생각해봅시다.dp[i] : 주어진 동전을 가지고 금액 i를 만드는 경우의 수 예를 들어 목표 금액이 30원이고, 동전이 5원, 10원짜리가 있을 때 일단은 5원짜리만 있다고 가정했을 때 dp[30] : 5원짜리로 30원을 만드는 경우의 수이제 10원짜리 동전을 추가해보자. dp[30] : 3..

Algorithm/DP 2017.05.01