1. Bottom-Up
import java.util.Scanner;
public class Main {
static long mod = 1000000009;
static long[][] A = new long[100000+1][4]; // n을 1, 2, 3의 합으로 나타내는 방법의 수를 저장하는 배열
public static void main(String[] args) {
Scanner sc = new Scanner(System.in);
int cnt = sc.nextInt();
add123();
for (int i=0;i<cnt;i++) {
int num = sc.nextInt();
System.out.println((A[num][1] + A[num][2] + A[num][3])%mod);
}
}
public static void add123() {
// Bottom-UP 방식
// A[i][j] = i를 1, 2, 3의 합으로 만드는 방법의수, j는 마지막으로 더한 수
// 점화식 : A[n] = A[n][1] + A[n][2] + A[n][3]
// A[n][1] = A[n-1][2] + A[n-1][3]
// A[n][2] = A[n-2][1] + A[n-2][3]
// A[n][3] = A[n-3][1] + A[n-3][2]
// 예외처리 (중복 피하기 위함)
A[1][1] = 1%mod;
A[2][2] = 1%mod;
A[3][1] = (A[2][2] + A[2][3])%mod;
A[3][2] = (A[1][1] + A[1][3])%mod;
A[3][3] = 1%mod;
for (int i=4;i<100001;i++) {
A[i][1] = A[i-1][2] + A[i-1][3]; // 마지막에 1을 더해서 n을 만드는 경우의 수
A[i][2] = A[i-2][1] + A[i-2][3]; // 마지막에 2을 더해서 n을 만드는 경우의 수
A[i][3] = A[i-3][1] + A[i-3][2]; // 마지막에 3을 더해서 n을 만드는 경우의 수
A[i][1] %= mod;
A[i][2] %= mod;
A[i][3] %= mod;
}
}
}
2. Top-Down : 시간초과 발생.. 해결 방법 찾지 못함 ㅠ
import java.io.*;
import java.util.Scanner;
public class Main {
static int[][] A; // n을 1, 2, 3의 합으로 나타내는 방법의 수를 저장하는 배열
public static void main(String[] args) throws IOException {
Scanner sc = new Scanner(System.in);
int cnt = sc.nextInt();
for (int i=0;i<cnt;i++) {
int num = sc.nextInt();
A = new int[num+1][4];
System.out.println(add123(num));
}
}
public static int add123(int n) {
// Top-Down 방식
// A[i][j] = i를 1, 2, 3의 합으로 만드는 방법의수, j는 마지막으로 더한 수
// 점화식 : A[n] = A[n][1] + A[n][2] + A[n][3]
// A[n][1] = A[n-1][2] + A[n-1][3]
// A[n][2] = A[n-2][1] + A[n-2][3]
// A[n][3] = A[n-3][1] + A[n-3][2]
// 예외처리 (중복 피하기 위함)
if (n < 2) {
A[n][1] = 1;
return 1;
}
if (A[n-1][1] == 0 && A[n-1][2] == 0 && A[n-1][3] == 0) {
add123(n-1);
}
if (n == 2) {
A[n][2] = 1;
return 2;
}
if (n == 3) {
A[n][1] = A[n-1][2] + A[n-1][3];
A[n][2] = A[n-2][1] + A[n-2][3];
A[n][3] = 1;
return 3;
}
A[n][1] = A[n-1][2] + A[n-1][3]; // 마지막에 1을 더해서 n을 만드는 경우의 수
A[n][2] = A[n-2][1] + A[n-2][3]; // 마지막에 2을 더해서 n을 만드는 경우의 수
A[n][3] = A[n-3][1] + A[n-3][2]; // 마지막에 3을 더해서 n을 만드는 경우의 수
int temp = (A[n][1] + A[n][2] + A[n][3])%1000000009;
return temp;
}
}
'알고리즘 > 백준 알고리즘(JAVA)' 카테고리의 다른 글
JAVA)2193번 이친수 - 다이나믹 프로그래밍 (0) | 2020.07.23 |
---|---|
JAVA)10844번 쉬운 계단 수 - 다이나믹 프로그래밍 (0) | 2020.07.23 |
JAVA)16194번 카드 구매하기 2 - 다이나믹 프로그래밍 (0) | 2020.07.21 |
JAVA)11052번 카드 구매하기 - 다이나믹 프로그래밍 (0) | 2020.07.21 |
JAVA)11727번 2*n 타일링 2 - 다이나믹 프로그래밍 (0) | 2020.07.20 |
알고리즘/백준 알고리즘(JAVA)
63개JAVA)15990번 1, 2, 3 더하기 5 - 다이나믹 프로그래밍
1. Bottom-Up import java.util.Scanner; public class Main { static long mod = 1000000009; static long[][] A = new long[100000+1][4]; // n을 1, 2, 3의 합으로 나타내는 방법의 수를 저장하는 배열 public static void main(String[] args) { Scanner sc = new Scanner(System.in); int cnt = sc.nextInt(); add123(); for (int i=0;i
알고리즘/백준 알고리즘(JAVA) 2020.07.23 starmk95JAVA)16194번 카드 구매하기 2 - 다이나믹 프로그래밍
1. Top-Down import java.util.*; public class Main { static int[] A; // 인덱스 개수의 카드를 구입하는데 든 최소 비용 static int[] P; // 인덱스 개의 카드를 포함하는 카드팩의 가격 public static void main(String[] args) { Scanner sc = new Scanner(System.in); int card = sc.nextInt(); A = new int[card+1]; P = new int[card+1]; for (int i=1;i
알고리즘/백준 알고리즘(JAVA) 2020.07.21 starmk95JAVA)11052번 카드 구매하기 - 다이나믹 프로그래밍
해당 문제를 위한 알고리즘을 해결해야 하는 부분 문제의 수가 n(카드 개수)개, 각 부분 문제를 해결하기 위해 총 n개의 수를 비교해서 그 중 최대값을 구해야 하므로 부분 문제당 O(n)의 시간이 소요된다. 결국 O(n^2)의 시간복잡도를 갖는다. 1. Top-Down 방식 import java.util.*; public class Main { static int[] A; // 해당 인덱스 개수의 카드를 구매하는 최대 금액 static int[] P; // 인덱스 개수의 카드를 포함하는 카드팩의 가격 public static void main(String[] args) { Scanner sc = new Scanner(System.in); int cardNum = sc.nextInt(); P = new i..
알고리즘/백준 알고리즘(JAVA) 2020.07.21 starmk95JAVA)11727번 2*n 타일링 2 - 다이나믹 프로그래밍
1. Top-Down import java.util.Scanner; public class Main { static int[] memo; public static void main(String[] args) { Scanner sc = new Scanner(System.in); int n = sc.nextInt(); memo = new int[n+1]; memo[0] = 1; memo[1] = 1; System.out.println(tiling(n)); } public static int tiling(int num) { // Top-Down 방식 // A[n] = 2*n 직사각형을 타일로 채우는 방법의 수 // 점화식 : A[n] = A[n-1] + A[n-2]*2 (세로로 하나 놓았을 때 + 가로로 2개..
알고리즘/백준 알고리즘(JAVA) 2020.07.20 starmk95JAVA) 11726번 2*n 타일링 - 다이나믹 프로그래밍
1. Top-Down 방식 import java.util.Scanner; public class Main { static int[] memo; public static void main(String[] args) { Scanner sc = new Scanner(System.in); int n = sc.nextInt(); memo = new int[n+1]; memo[0] = 1; memo[1] = 1; System.out.println(tiling(n)); } public static int tiling(int num) { // Top-Down 방식 // A[n] = 2*n 직사각형을 타일로 채우는 방법의 수 // 점화식 : A[n] = A[n-1] + A[n-2] (세로로 하나 놓았을 때 + 가로로 2..
알고리즘/백준 알고리즘(JAVA) 2020.07.20 starmk95JAVA) 1463번 1로 만들기 - 다이나믹 프로그래밍
1. Top-Down 방식 import java.util.*; public class Main{ public static int[] memo; // memorization을 위한 배열 public static void main(String[] args) { Scanner sc = new Scanner(System.in); int num = sc.nextInt(); memo = new int[num+1]; memo[0] = 0; memo[1] = 0; System.out.println(makeOne(num)); } public static int makeOne(int num) { // Top-Down 방식 // D[n] : n을 1로 만들기 위해 사용되는 연산의 횟수 // 점화식 : D[n] = min(D..
알고리즘/백준 알고리즘(JAVA) 2020.07.20 starmk95JAVA)1935번 후위 표기식 2 - Stack(스택) 사용
해설은 주석 참고 import java.util.Scanner; import java.util.Stack; public class Main { public static void main(String[] args) { Stack operand = new Stack(); // 피연산자 스택 Scanner sc = new Scanner(System.in); int n = sc.nextInt(); // 피연산자의 개수 Double[] operandArray = new Double[n]; // 피연산자들을 저장하는 배열 String cmd = sc.next(); // 수식 받아오기 for (int i=0;i ASCII 코드 사용 // 각 알파벳은 A = 65, ..., Z = 90의 아스키 코드 값을 갖는다. /..
알고리즘/백준 알고리즘(JAVA) 2020.07.19 starmk95JAVA)1373번 2진수 8진수로 변환하기
2진수의 각 3자리는 8진수의 1자리로 변환된다. import java.util.Scanner; public class Main { public static void main(String[] args) { Scanner sc = new Scanner(System.in); String binaryNum = sc.nextLine(); // 2진수를 8진수로 변환하면 2진수의 자리수 3개가 8진수 자리수 1개로 변환된다. if (binaryNum.length()%3 == 1) { // 2진수 가장 앞의 한자리가 8진수의 첫자리를 의미 System.out.print(Character.getNumericValue(binaryNum.charAt(0))*1); } else if (binaryNum.length()%3..
알고리즘/백준 알고리즘(JAVA) 2020.07.19 starmk95JAVA)17087번 숨바꼭질 6
수빈이가 이동하는 방법은 +D 또는 -D 밖에 없다. -> 수빈이 동생을 찾기 위해서는 수빈과 동생과의 거리가 D의 배수여야 한다. 동생이 한명이라면? -> D = 수빈과 동생과의 거리의 약수이면 된다. 동생이 n명이라면? -> D = 수빈과 동생들과의 거리들의 공약수이면 된다. D의 최대값 = 거리들의 최대공약수 즉, 최대공약수를 구하는 알고리즘을 사용하여 해결하면 된다. 최대공약수를 구하는 알고리즘은 유클리드 호제법을 사용했다. import java.util.Scanner; public class Main { public static void main(String[] args){ Scanner sc = new Scanner(System.in);; int n = sc.nextInt(); // 동생 n명..
알고리즘/백준 알고리즘(JAVA) 2020.07.19 starmk95JAVA)1676번 팩토리얼에서 0의 개수 구하기
팩토리얼에서 0의 개수란? ex) 10! = 362800 -> 2개 팩토리얼에서 0의 개수를 구하는 방법은 팩토리얼의 인수에 2*5(10)이 들어있는 개수를 구하면 된다. (0을 만들 수 있는 방법이 2*5밖에 없기 떄문) 인수들에서 5를 포함하는 수보다(5의 배수) 2를 포함하는 수가 더 많기 떄문에 5를 포함하는 인수들의 개수를 구해주면 팩토리얼에 들어가는 0의 개수를 알아낼 수 있다. 이 때, 5*5 또는 5*5*5처럼 5가 여러번 들어가는 경우도 고려해주어야한다. ex) 입력이 100이라고 가정하면, 100/5 = 20 -> 5가 20번 들어감 100/25 = 4 -> 5가 2개 들어가는 경우는 4번 따라서 20 + 4 = 24 100!에 들어있는 0의 개수는 총 24개이다. import java..
알고리즘/백준 알고리즘(JAVA) 2020.07.19 starmk95JAVA)1929번 M이상 N이하의 소수구하기 - 에라토스테네스의 체
소수의 개수를 파악하는데 에라토스체네스의 체를 사용했다. 에라토스체네스의 체는 2개의 단계를 반복 수행하는 것으로 이루어진다. 1. 지워지지 않은 수 중에서 가장 작은 수 -> 소수이다. 2. 1단계에서 구한 소수의 배수들을 모두 지원준다. // 해당과정 반복 설명은 주석 참고 import java.util.Scanner; public class Main { public static void main(String[] args) { Scanner sc = new Scanner(System.in); int sNum = sc.nextInt(); int eNum = sc.nextInt(); int[] prime = new int[eNum-sNum+1]; // 소수 저장 int pn = 0; // 소수의 개수 b..
알고리즘/백준 알고리즘(JAVA) 2020.07.19 starmk95JAVA)1978번 소수 판별 문제
소수를 판별하기 위해서는 그 수가 소인수(자연수를 나누어 떨어뜨리는 약수 중 소수인 수)를 갖는 지 확인해야한다. 어떤 수가 소수가 아니라면, 그 수(N)는 N = a*b (a, b는 소수)꼴로 나타낼 수 있다. 이 때, a>b 라고 하면, a는 언제나 루트(N)보다 작은 값을 가지고, b는 루트(N)보다 큰 값을 가진다. 그러므로 루트(N)보다 작은 수에 대해서만 N이 나누어떨어지는지 확인하면 N이 소수인지의 여부를 파악할 수 있다. 반복문은 루트(N)번 반복되며 시간 복잡도는 O(루트(N))이다. import java.util.Scanner; public class Main { public static void main(String[] args) { Scanner sc = new Scanner(Sys..
알고리즘/백준 알고리즘(JAVA) 2020.07.19 starmk95