1. Top-Down 방식
import java.util.*;
public class Main {
static long A[][]; // n자리의 이친수의 개수를 저장하는 배열
public static void main(String[] args) {
Scanner sc = new Scanner(System.in);
int num = sc.nextInt();
A = new long[num+1][2];
pinaryNum(num);
System.out.println(A[num][0] + A[num][1]);
}
public static void pinaryNum(int n) {
// Top-Down 방식
// A[i][j] = 마지막 자리 숫자가 j인 i자리 이친수의 개수
// 점화식 : A[n] = A[n][0] + A[n][1]
// A[n][0] = A[n-1][0] + A[n-1][1] (0은 0 또는 1 모두 앞에 올 수 있음)
// A[n][1] = A[n-1][0] (1은 0 앞에만 올 수 있음)
// 이전 자리수가 0으로 끝나면 0또는 1 두가지 경우가 올 수 있지만
// 전 자리수가 1로 끝나면 0밖에 올 수 없다. (한가지 경우만 존재) (끝에 10을 하나로 묶어서 생각할 수 있다 -> A[n-2]에 붙인다고 생각)
if (n < 2) {
A[1][1] = 1;
return;
}
if (A[n-1][0] == 0 && A[n-1][1] == 0) {
pinaryNum(n-1);
}
A[n][0] = A[n-1][0] + A[n-1][1];
A[n][1] = A[n-1][0];
}
}
2. Bottom-Up 방식
import java.util.*;
public class Main {
static long A[][]; // n자리의 이친수의 개수를 저장하는 배열
public static void main(String[] args) {
Scanner sc = new Scanner(System.in);
int num = sc.nextInt();
A = new long[num+1][2];
pinaryNum(num);
System.out.println(A[num][0] + A[num][1]);
}
public static void pinaryNum(int n) {
// Bottom-Up 방식
// A[i][j] = 마지막 자리 숫자가 j인 i자리 이친수의 개수
// 점화식 : A[n] = A[n][0] + A[n][1]
// A[n][0] = A[n-1][0] + A[n-1][1] (0은 0 또는 1 모두 앞에 올 수 있음)
// A[n][1] = A[n-1][0] (1은 0 앞에만 올 수 있음)
A[1][1] = 1;
for (int i=2;i<n+1;i++) {
A[i][0] = A[i-1][0] + A[i-1][1];
A[i][1] = A[i-1][0];
}
}
}
# memorization을 일차원 배열로 해결하기 - 이친수 문제는 고려할 경우의 수가 0 또는 1로 두가지 밖에 없으므로 1차원 배열로도 다이나믹 프로그래밍을 수행할 수 있다.
1. Top-Down
import java.util.*;
public class Main {
static long A[]; // n자리의 이친수의 개수를 저장하는 배열 (일차원 배열로 해결하기
public static void main(String[] args) {
Scanner sc = new Scanner(System.in);
int num = sc.nextInt();
A = new long[num+1];
pinaryNum(num);
System.out.println(A[num]);
}
public static void pinaryNum(int n) {
// Bottom-Up 방식
// A[i][j] = 마지막 자리 숫자가 j인 i자리 이친수의 개수
// 점화식 : A[n] = A[n-1] + A[n-2]
// A[n-1] : 전 이진수가 0으로 끝나는 경우 -> 마지막 자리에 0, 1 모두 올 수 있음
// A[n-2] : 전 이진수가 1로 끝나는 경우 -> 마지막 자리에 0 밖에 올 수 없음
// 01을 한 묶음으로 생각해서 A[n-2]에 01을 추가한 경우를 생각하면 됨
if (n < 2) {
A[1] = 1;
return;
}
if (A[n-1] == 0) {
pinaryNum(n-1);
}
A[n] = A[n-1] + A[n-2];
}
}
2. Bottom-Up
import java.util.*;
public class Main {
static long A[]; // n자리의 이친수의 개수를 저장하는 배열 (일차원 배열로 해결하기
public static void main(String[] args) {
Scanner sc = new Scanner(System.in);
int num = sc.nextInt();
A = new long[num+1];
pinaryNum(num);
System.out.println(A[num]);
}
public static void pinaryNum(int n) {
// Bottom-Up 방식
// A[i][j] = 마지막 자리 숫자가 j인 i자리 이친수의 개수
// 점화식 : A[n] = A[n-1] + A[n-2]
// A[n-1] : 전 이진수가 0으로 끝나는 경우 -> 마지막 자리에 0, 1 모두 올 수 있음
// A[n-2] : 전 이진수가 1로 끝나는 경우 -> 마지막 자리에 0 밖에 올 수 없음
// 01을 한 묶음으로 생각해서 A[n-2]에 01을 추가한 경우를 생각하면 됨
A[1] = 1;
for (int i=2;i<n+1;i++) {
A[i] = A[i-1] + A[i-2];
}
}
}
알고리즘/백준 알고리즘(JAVA)
63개JAVA)3085번 사탕게임 - 브루트 포스
import java.util.*; public class Main { static char[][] candy; static int ans = 1; public static void main(String[] args) { Scanner sc = new Scanner(System.in); int cnt = sc.nextInt(); candy = new char[cnt][cnt]; for (int i=0;i 상하좌우 4가지 경우) // 그러나 첫 원소부터 오른쪽 또는 아래의 원소와 바꾸다보면 다음 원소에서의 위 또는 왼쪽 원소와 바꾸는 연산은 중복되는 연산이므로 수행할 필요가 없다. // 그러므로 각 원소마다 오른쪽과 아래의 원소만 교환하는 경우만 생각하면 된다. -> 2(n^2) // 바꾼 칸의 경우마다 ..
알고리즘/백준 알고리즘(JAVA) 2020.08.02 starmk95JAVA)2309번 일곱 난쟁이 - 브루트 포스
import java.util.*; public class Main { public static void main(String[] args) { Scanner sc = new Scanner(System.in); int[] dwarf = new int[9]; int sum = 0; for (int i=0;i
알고리즘/백준 알고리즘(JAVA) 2020.08.02 starmk95JAVA)11057번 오르막길 - 다이나믹 프로그래밍
import java.util.*; public class Main { public static void main(String[] args) { Scanner sc = new Scanner(System.in); int n = sc.nextInt(); int mod = 10007; int[][] A = new int[n][10]; // A[i][j] = 길이가 i이고 마지막 숫자가 j인 오르막수의 개수 // Bottom-Up 방식 // 점화식 : A[i][j] = A[i-1][0] + A[i-1][1] + ... A[i-1][j] for (int i=0;i
알고리즘/백준 알고리즘(JAVA) 2020.07.28 starmk95JAVA)1309번 동물원 - 다이나믹 프로그래밍
import java.util.*; public class Main { public static void main(String[] args) { Scanner sc = new Scanner(System.in); int mod = 9901; int n = sc.nextInt(); int [][] A = new int[3][n]; // A[0][n] = n번째 칸에 배치안하는 경우의 수, A[1][n] = n번째 칸의 왼쪽에 배치하는 경우의 수, A[0][n] = n번째 칸의 오른쪽에 배치하는 경우의 수 // Bottom-Up // 점화식 : A[0][i] = A[0][i-1] + A[1][i-1] + A[2][i-1] // A[1][i] = A[0][i-1] + A[2][i-1] // A[2][i] = A..
알고리즘/백준 알고리즘(JAVA) 2020.07.28 starmk95JAVA)1149번 RGB거리 - 다이나믹 프로그래밍
import java.util.*; public class Main { public static void main(String[] args) { Scanner sc = new Scanner(System.in); int cnt = sc.nextInt(); int[][] costs = new int[cnt][3]; // i번째 집을 각 색으로 칠하는데 드는 비용 (0행은 Red, 1행은 Green, 2행은 Blue) int[][] A = new int[cnt][3]; // 1~n번째 집들을 각 색으로 칠하는데 드는 최소 비용 (0행은 Red, 1행은 Green, 2행은 Blue) for (int i=0;i
알고리즘/백준 알고리즘(JAVA) 2020.07.28 starmk95JAVA)2225번 합분해 - 다이나믹 프로그래밍
import java.util.*; public class Main { public static void main(String[] args) { Scanner sc = new Scanner(System.in); int n = sc.nextInt(); int k = sc.nextInt(); long[][] cases = new long[n+1][k+1]; // 0~n까지의 정수 k개를 더해서 그 합을 n으로 만드는 경우의 수 long mod = 1000000000; // Bottom-Up 방식 // 점화식 : cases[n][k] = cases[0][k-1] + cases[1][k-1] + ... + cases[n][k-1] cases[0][0] = 1; for (int i=1;i
알고리즘/백준 알고리즘(JAVA) 2020.07.28 starmk95JAVA)1699번 제곱수의 합 - 다이나믹 프로그래밍
import java.util.*; public class Main { public static void main(String[] args) { Scanner sc = new Scanner(System.in); int num = sc.nextInt(); int[] A = new int[num+1]; // A[i] = i를 제곱수로 나타냈을때, 필요한 항의 최소 개수 // Bottom-Up 방식 // 점화식 : A[i] = min(A[i-j*j] + 1) (1
알고리즘/백준 알고리즘(JAVA) 2020.07.28 starmk95JAVA)1912번 연속합 - 다이나믹 프로그래밍
import java.util.Scanner; public class Main { public static void main(String[] args) { Scanner sc = new Scanner(System.in); int cnt = sc.nextInt(); int[] numbers = new int[cnt]; // 입력받은 수들을 기록 int[] sums = new int[cnt]; // 연속된 수의 합을 기록 for (int i=0;i
알고리즘/백준 알고리즘(JAVA) 2020.07.28 starmk95JAVA)14002 가장 긴 증가하는 부분 수열 4 - 다이나믹 프로그래밍
import java.util.Scanner; public class Main { static int[] numbers; static int[] len; static int[] prexIndex; public static void main(String[] args) { Scanner sc = new Scanner(System.in); int cnt = sc.nextInt(); numbers = new int[cnt]; // 수열 담기 len = new int[cnt]; // 수열의 각 수에 대한 가장 긴 증가하는 부분 수열의 길이 prexIndex = new int[cnt]; // 가장 긴 증가하는 부분 수열의 직전의 수 for (int i=0;i
알고리즘/백준 알고리즘(JAVA) 2020.07.28 starmk95JAVA)11053 가장 긴 증가하는 부분 수열 - 다이나믹 프로그래밍
Bottom-Up방식으로 구현 import java.util.Scanner; public class Main { public static void main(String[] args) { Scanner sc = new Scanner(System.in); int cnt = sc.nextInt(); int[] numbers = new int[cnt+1]; // 수열 담기 int[] len = new int[cnt+1]; // 수열의 각 수에 대한 가장 긴 증가하는 부분 수열의 길이 int maxLen = 0; for (int i=0;i
알고리즘/백준 알고리즘(JAVA) 2020.07.28 starmk95JAVA)2193번 이친수 - 다이나믹 프로그래밍
1. Top-Down 방식 import java.util.*; public class Main { static long A[][]; // n자리의 이친수의 개수를 저장하는 배열 public static void main(String[] args) { Scanner sc = new Scanner(System.in); int num = sc.nextInt(); A = new long[num+1][2]; pinaryNum(num); System.out.println(A[num][0] + A[num][1]); } public static void pinaryNum(int n) { // Top-Down 방식 // A[i][j] = 마지막 자리 숫자가 j인 i자리 이친수의 개수 // 점화식 : A[n] = A[n]..
알고리즘/백준 알고리즘(JAVA) 2020.07.23 starmk95JAVA)10844번 쉬운 계단 수 - 다이나믹 프로그래밍
Bottom-Up 방식으로 해결 import java.util.*; public class Main { static long mod = 1000000000; static long[][] A; public static void main(String[] args) { Scanner sc = new Scanner(System.in); int num = sc.nextInt(); A = new long[num+1][10]; stairNum(num); long temp = 0; for (int i=0;i
알고리즘/백준 알고리즘(JAVA) 2020.07.23 starmk95