https://www.acmicpc.net/problem/9095
코드 :
1. 처음 짠 코드
import java.io.BufferedReader;
import java.io.IOException;
import java.io.InputStreamReader;
public class Main {
static int count;
static int[] memo;
public static void main(String[] args) throws IOException {
BufferedReader br = new BufferedReader(new InputStreamReader(System.in));
StringBuilder sb = new StringBuilder();
int T = Integer.parseInt(br.readLine());
for (int i = 0; i < T; i++) {
int n = Integer.parseInt(br.readLine());
count = 0;
solution(n, 0);
sb.append(count).append("\n");
}
System.out.println(sb);
}
public static void solution(int n, int sum){
for (int i = 1; i <= 3; i++) {
if(sum < n){
solution(n, sum+ i);
}
if(sum == n){
count++;
break;
}
if(sum > n){
break;
}
}
}
}
dp를 어디서 쓸지 모르겠어서 그냥 처음에 푼 코드이다.
2. 탑다운
import java.io.BufferedReader;
import java.io.IOException;
import java.io.InputStreamReader;
public class Main {
static int[] memo;
public static void main(String[] args) throws IOException {
BufferedReader br = new BufferedReader(new InputStreamReader(System.in));
StringBuilder sb = new StringBuilder();
int T = Integer.parseInt(br.readLine());
memo = new int[11]; // 0<n<11
memo[1] = 1;
memo[2] = 2;
memo[3] = 4;
for (int i = 0; i < T; i++) {
int n = Integer.parseInt(br.readLine());
sb.append(dp(n)).append("\n");
}
System.out.println(sb);
}
public static int dp(int n){
if(memo[n] != 0){
return memo[n];
}
memo[n] = dp(n-1) +dp(n-2) + dp(n-3);
return memo[n];
}
}
3. 바텀업
import java.io.BufferedReader;
import java.io.IOException;
import java.io.InputStreamReader;
public class Main {
static int[] memo;
public static void main(String[] args) throws IOException {
BufferedReader br = new BufferedReader(new InputStreamReader(System.in));
StringBuilder sb = new StringBuilder();
int T = Integer.parseInt(br.readLine());
memo = new int[11]; // 0<n<11
memo[1] = 1;
memo[2] = 2;
memo[3] = 4;
for (int i = 0; i < T; i++) {
int n = Integer.parseInt(br.readLine());
for (int j = 4; j <= n; j++) {
memo[j] = memo[j-1] + memo[j-2] + memo[j-3];
}
sb.append(memo[n]).append("\n");
}
System.out.println(sb);
}
}
속도는 1번, 3번이 72m/s, 2번 은 80m/s가 나왔다.
결국 푸는법을 몰라 찾아봐서 dp를 사용했는데, 의외로 그냥 점화식으로 직전의 2xn 직사각형 문제와 유사하다.
참고 :
여기 설명이 잘 와닿았다.
'알고리즘 > 백준' 카테고리의 다른 글
백준 16194번 - 카드 구매하기 2 (Java 8) (2) | 2022.03.24 |
---|---|
백준 11052번 - 카드 구매하기 (Java 8) (0) | 2022.03.23 |
백준 11727번 - 2xn 타일링2 (Java 8) (0) | 2022.03.22 |
백준 11726번 - 2xn 타일링 (Java 8) (0) | 2022.03.22 |
백준 1463번 - 1로 만들기 (Java 8) (0) | 2022.03.21 |
댓글