https://www.acmicpc.net/problem/2502
코드설명
동적계획법(DP, Dynamic Programming) + 완전탐색(BruteForce)을 활용합니다.
아떻게 접근했을까요? fibonacci의 아이디어에서 며칠이 지난지 주어지는 입력 A가 몇개의 1일차, 2일차로 이루어지는지 연산했습니다.
이렇게 할경우 예시로
입력
6 41
출력 (1과 2의 개수)
3 5
입력
7 218
1과 2의 개수
5 8
처럼 나오는 것을 알 수 있습니다.
이에 맞추어서 브루트포스로 41을 3과 5로 만드는 모든 방법을 연산시킵니다.
이떄 1 <= A <= B라는 조건이 있으므로, 2중for문으로 연산시켰습니다.
처음에 입력2인 아래의 입력이 주어졌을떄
7 218
answer
2
26
답이 2 26 으로 나와서 틀린줄알았으나, 문제예시에 여러개의 답이 존재할 수 있다고 합니다. 그러므로 정답입니다.
코드
정답코드1입니다.
package Main;
import java.io.BufferedReader;
import java.io.IOException;
import java.io.InputStreamReader;
import java.util.StringTokenizer;
public class Main {
static int N, M, S, P, A, B, X, L, R, C, n, k, m, l, K, D, T;
static int[] answer = new int[2];
public static void main(String[] args) throws IOException{
BufferedReader br = new BufferedReader(new InputStreamReader(System.in));
StringTokenizer st = new StringTokenizer(br.readLine());
A = Integer.parseInt(st.nextToken());
B = Integer.parseInt(st.nextToken());
int[] temp = fiboCount(A);
for(int i=1; ; i++) {
for(int j=i; ; j++) {
int aNum = i;
int bNum = j;
int ret = temp[0] * i + temp[1] * j;
if(ret > B) break;
if(ret == B) {
answer[0] = i;
answer[1] = j;
System.out.println(answer[0] + " "+ answer[1]);
return ;
}
}
}
}
static int[] fiboCount(int x) {
if(x == 1) return new int[] {1, 0};
if(x == 2) return new int[] {0, 1};
int[] ret1 = fiboCount(x - 1);
int[] ret2 = fiboCount(x - 2);
int[] ret = new int[] {ret1[0] + ret2[0], ret1[1] + ret2[1]};
return ret;
}
}
메모이제이션 적용한 정답코드2입니다.
package Main;
import java.io.BufferedReader;
import java.io.IOException;
import java.io.InputStreamReader;
import java.util.Arrays;
import java.util.StringTokenizer;
public class Main {
static int N, M, S, P, A, B, X, L, R, C, n, k, m, l, K, D, T;
static int[] answer = new int[2];
static int[][] cache = new int[31][2];
public static void main(String[] args) throws IOException{
BufferedReader br = new BufferedReader(new InputStreamReader(System.in));
StringTokenizer st = new StringTokenizer(br.readLine());
A = Integer.parseInt(st.nextToken());
B = Integer.parseInt(st.nextToken());
for(int i=0; i<31; i++) {
Arrays.fill(cache[i], -1);
}
int[] temp = fiboCount(A);
for(int i=1; ; i++) {
for(int j=i; ; j++) {
int aNum = i;
int bNum = j;
int ret = temp[0] * i + temp[1] * j;
if(ret > B) break;
if(ret == B) {
answer[0] = i;
answer[1] = j;
System.out.println(answer[0] +"\n"+ answer[1]);
return ;
}
}
}
}
static int[] fiboCount(int x) {
if(x == 1) return new int[] {1, 0};
if(x == 2) return new int[] {0, 1};
if(cache[x][0] != -1 && cache[x][1] != -1) return cache[x];
int[] ret1 = fiboCount(x - 1);
int[] ret2 = fiboCount(x - 2);
int[] ret = new int[] {ret1[0] + ret2[0], ret1[1] + ret2[1]};
return cache[x] = ret;
}
}
'알고리즘 > 백준' 카테고리의 다른 글
[백준] 3184 양 - BFS(넓이우선탐색) JAVA (0) | 2024.10.04 |
---|---|
[백준] 2583 영역 구하기 - BFS(넓이우선탐색) JAVA (0) | 2024.10.02 |
[백준] 2468 안전 영역 - BFS(넓이우선탐색) JAVA (0) | 2024.10.01 |
[백준] 1946 신입 사원 - 탐욕법(Greedy) + 정렬(Sort) JAVA (0) | 2024.09.27 |
[백준] 1926 그림 - BFS(너비우선탐색) JAVA (0) | 2024.09.27 |