PS(Java)
![[PS] 백준 2193번 이친수 - DP](https://img1.daumcdn.net/thumb/R750x0/?scode=mtistory2&fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdna%2FCrU1P%2FbtrsRZyXxjl%2FAAAAAAAAAAAAAAAAAAAAALVDxwPzvPy5NhB_WCwW3Umw2Jp5NT336Q3jwBgcayK7%2Fimg.png%3Fcredential%3DyqXZFxpELC7KVnFOS48ylbz2pIh7yKj8%26expires%3D1756652399%26allow_ip%3D%26allow_referer%3D%26signature%3DEEA%252F9Z1goNeqUWqbZePcVQzXOkA%253D)
[PS] 백준 2193번 이친수 - DP
문제 예제 풀이 이 문제도 앞서 쭉 푼 문제들과 비슷하다. 오히려 조건이 더 단순해서 쉽게 풀었다. 이친수의 조건은 다음과 같다. 0과 1만 사용 (이진수) 1이 연속되면 안된다. 0으로 시작하지 않는다. dp[자리길이][마지막자릿값] 배열을 선언한다. 마지막 자릿값이 0이면 뒤에 0이나 1이 올 수 있다.(두 가지 경우의 수) 마지막 자릿값이 1이면 뒤에 0만 올 수 있다.(한 가지 경우의 수) 4자리와 5자리 이친수의 예를 들어보자 dp[4][0] = {1000, 1010} dp[4][1] = {1001} dp[5][0] = {10000, 10100, 10011} dp[5][1] = {10001, 10101} 따라서 dp[n][0] = dp[n-1][0] + dp[n-1][1] 이고 dp[n][1..
![[PS] 백준 11057번 오르막 수 - DP](https://img1.daumcdn.net/thumb/R750x0/?scode=mtistory2&fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdna%2FljY4q%2FbtrsC9PG1WQ%2FAAAAAAAAAAAAAAAAAAAAAINXaWQXeCAMwnC0Us4r6A0sAukN5J95M-dS-V47YQWh%2Fimg.png%3Fcredential%3DyqXZFxpELC7KVnFOS48ylbz2pIh7yKj8%26expires%3D1756652399%26allow_ip%3D%26allow_referer%3D%26signature%3Dk9OMLs%252B%252BFnhYjN2T2XFRo0n4zWQ%253D)
[PS] 백준 11057번 오르막 수 - DP
문제 예제 풀이 이 문제는 쉬운 계단 수 문제의 연장선이다. 주의할 점은 계단 수와 달리 숫자를 0부터 시작할 수 있다. 똑같이 dp[자릿수길이][마지막자릿수] 이차원배열을 사용하였고, 다음 필기와 같은 규칙성을 찾을 수 있다. 따라서 도출되는 점화식 dp[n][i] = dp[n-1][0] + dp[n-1][1] + dp[n-1][2] + ... + dp[n-1][i]를 사용하여 푼다. 코드 import java.util.Arrays; import java.util.Scanner; public class Main { final static long mod = 10007; public static void main(String[] args) { Scanner sc = new Scanner(System.in..
![[PS] 백준 10844번 쉬운 계단 수 - DP](https://img1.daumcdn.net/thumb/R750x0/?scode=mtistory2&fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdna%2FkUhm1%2FbtrsxEprIYp%2FAAAAAAAAAAAAAAAAAAAAALcFbRziLLPTzl_pE7QemduoYphJfdAVtXAj0j95k5W8%2Fimg.png%3Fcredential%3DyqXZFxpELC7KVnFOS48ylbz2pIh7yKj8%26expires%3D1756652399%26allow_ip%3D%26allow_referer%3D%26signature%3Dug%252FpH90Z5Us1C1ilw%252FvcCMNHJRo%253D)
[PS] 백준 10844번 쉬운 계단 수 - DP
문제 10844번: 쉬운 계단 수 첫째 줄에 정답을 1,000,000,000으로 나눈 나머지를 출력한다. www.acmicpc.net 풀이 dp[자릿수길이][마지막자릿수]로 이차원 배열을 사용하여 푼다. 이 풀이를 참고하였다. 0~9까지의 숫자를 사용할 수 있으나 0이 첫번째 자리에 오면 안된다. 따라서 길이가 1인 dp[1][1~9]의 값은 순서대로 1,2,3,4,5,6,7,8,9 로 경우의 수가 1개씩 밖에 없다. 길이가 1인 계단수의 총 개수는 9개가 된다. 1~9까지의 숫자의 경우, 계단 수 규칙에 따라 옆자리에 -1, +1인 수가 올 수 있다. (경우의 수가 2) 위 필기에서 나열된 dp[2][ ], dp[3][ ]의 경우의 수를 보면 알 수 있듯이 규칙성에 따라 도출되는 점화식 dp[n] = ..
![[PS] 백준 9095번 1, 2, 3 더하기 - DP](https://img1.daumcdn.net/thumb/R750x0/?scode=mtistory2&fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdna%2Fb5QnWy%2FbtrszlWW8Vq%2FAAAAAAAAAAAAAAAAAAAAAC9SB_h-NVT0WaBJ1Axx6sQxwuUHL46lOJy167FO3LqQ%2Fimg.png%3Fcredential%3DyqXZFxpELC7KVnFOS48ylbz2pIh7yKj8%26expires%3D1756652399%26allow_ip%3D%26allow_referer%3D%26signature%3DpSbgj2M2CbVro%252Fb2N7%252FcjCLLrC0%253D)
[PS] 백준 9095번 1, 2, 3 더하기 - DP
문제 예제 풀이 점화식 dp[i] = dp[i-1] + dp[i-2] + dp[i-3] 를 사용하여 푼다. 코드 import java.util.Scanner; public class Main { public static void main(String[] args) { Scanner sc = new Scanner(System.in); int T = sc.nextInt(); Integer[] dp = new Integer[11]; dp[1] = 1; dp[2] = 2; dp[3] = 4; for(int i=4; i
![[PS] 백준 11727번 2×n 타일링 2 - DP](https://img1.daumcdn.net/thumb/R750x0/?scode=mtistory2&fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdna%2FsKW5c%2Fbtrsswk3z6K%2FAAAAAAAAAAAAAAAAAAAAABBoPvxdMKDl0TsbzeGpC-5KQsww2iQYnU8a8L1IGEvQ%2Fimg.png%3Fcredential%3DyqXZFxpELC7KVnFOS48ylbz2pIh7yKj8%26expires%3D1756652399%26allow_ip%3D%26allow_referer%3D%26signature%3DB6%252BfngEg7leZzajDEJA0x%252Bsfvq8%253D)
[PS] 백준 11727번 2×n 타일링 2 - DP
문제 예제 풀이 이 풀이를 참고했다. 코드 import java.util.Scanner; public class Main { static Integer[] dp; public static void main(String[] args) { Scanner sc = new Scanner(System.in); int N = sc.nextInt(); dp = new Integer[N+1]; dp[0] = dp[1] = 1; System.out.println(caculate(N)); } static int caculate(int n) { if(dp[n] == null) { dp[n] = (caculate(n-1) +(2*caculate(n-2))) % 10007; } return dp[n]; } }
![[PS] 백준 11726번 2×n 타일링 - DP](https://img1.daumcdn.net/thumb/R750x0/?scode=mtistory2&fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdna%2Fph2I9%2FbtrsveLtDnV%2FAAAAAAAAAAAAAAAAAAAAABt_bCAJb-ht_7EtNeAl-Uoe1fXPYChah6I8r5UZoadf%2Fimg.png%3Fcredential%3DyqXZFxpELC7KVnFOS48ylbz2pIh7yKj8%26expires%3D1756652399%26allow_ip%3D%26allow_referer%3D%26signature%3DgRAewrgjMbmDBiCqfb2qfj2Wz78%253D)
[PS] 백준 11726번 2×n 타일링 - DP
문제 예제 풀이 경우의 수를 따지면 1,2,3,5,8 ... 이렇게 결과가 나오는데, 방법은 2가지가 있다. 피보나치 수열로 푸는 방법 사각형을 그렸을 때의 경우의 수를 점화식으로 푸는 방법 2번의 경우 아래 그림에 따라 점화식 dp[n] = dp[n-1] + dp[n-2] 이 적용되는 것을 사용하는 거다. 주의할 점은 dp[n]의 값을 저장할 때 마다 10007로 나눈 값을 저장해야한다. 조건에서 n은 1000까지 커질 수 있는데, 결과가 출력할 때 나누면 특정 n을 넣었을 때 int 타입의 범위인 2^31승 약 열자리를 넘기때문이다. 코드 import java.util.Scanner; public class Main { static Integer[] dp; public static void main(..
![[PS] 백준 1463번 1로 만들기 - DP](https://img1.daumcdn.net/thumb/R750x0/?scode=mtistory2&fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdna%2Fbne6Fl%2FbtrssDdM56z%2FAAAAAAAAAAAAAAAAAAAAAOfS8FZO2TOlgHIctVJPef6hzEOJ_ZsLXE6SQklIrFPh%2Fimg.png%3Fcredential%3DyqXZFxpELC7KVnFOS48ylbz2pIh7yKj8%26expires%3D1756652399%26allow_ip%3D%26allow_referer%3D%26signature%3DQOFQ79gYTfZBlqtcedTtDGwhgCQ%253D)
[PS] 백준 1463번 1로 만들기 - DP
문제 예제 코드 import java.util.Scanner; public class Main { static Integer[] dp; public static void main(String[] args) { Scanner sc = new Scanner(System.in); int N = sc.nextInt(); dp = new Integer[N+1]; dp[0] = dp[1] = 0; System.out.println(caculate(N)); } static int caculate(int n) { if(dp[n] == null) { if(n%6==0) { dp[n] = Math.min(Math.min(caculate(n/2),caculate(n/3)),caculate(n-1)) + 1; } else i..