https://www.acmicpc.net/problem/2502

코드설명

동적계획법(DP, Dynamic Programming) + 완전탐색(BruteForce)을 활용합니다.

 

 

아떻게 접근했을까요? fibonacci의 아이디어에서 며칠이 지난지 주어지는 입력 A가 몇개의 1일차, 2일차로 이루어지는지 연산했습니다. 

이렇게 할경우 예시로

입력
6 41
출력 (12의 개수)
3 5
입력
7 218
12의 개수
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;
}
}

+ Recent posts