https://www.acmicpc.net/problem/2502
2502번: 떡 먹는 호랑이
첫줄에 첫 날에 준 떡의 개수 A를 출력하고 그 다음 둘째 줄에는 둘째 날에 준 떡의 개수 B를 출력한다. 이 문제에서 주어진 D, K에 대해서는 항상 정수 A, B (1≤A≤B)가 존재한다.
www.acmicpc.net
오늘 풀어본 문제는 백준의 떡 먹는 호랑이
기본적으로 다이나믹 프로그래밍 방법으로 푸는데 초깃값을 설정하는 것이 문제다.
나는 while문으로 초깃값을 설정하도록 했다. 처음에는 이분법으로 middle값을 가지고 문제를 풀다가 안되서 그냥 하나씩 값을 줄여줬다. 입력 값의 범위가 크지 않아서 가능한 방법인데,, 만약 범위가 크다면,,, 다른 방법을 찾아봐야 할것 같다.
import java.util.*;
class Main{
static int[] D;
static int d,k;
public static void main (String[] args) {
Scanner sc = new Scanner(System.in);
d = sc.nextInt();
k = sc.nextInt();
D = new int[d+1];
int left = 1;
int right = k;
while(left<right){
D[1] = left;
D[2] = right;
for(int i = 3; i<=d; i++){
D[i] = D[i-1]+D[i-2];
}
if(D[d] == k) break;
if(D[d] > k) {
right -= 1;
}else{
left += 1;
}
}
System.out.println(D[1]+"\n"+D[2]);
}
}
import java.util.*;
class Main{
static int[] D;
static int d,k;
public static void main (String[] args) {
Scanner sc = new Scanner(System.in);
d = sc.nextInt(); k = sc.nextInt();
D = new int[d+1];
int left = 1, right = k;
while(left<right){
D[1] = left;
D[2] = right;
for(int i = 3; i<=d; i++){
D[i] = D[i-1]+D[i-2];
}
if(D[d] == k) break;
right = D[d] > k ? right-1 : right;
left = D[d] < k ? left+1 : left;
}
System.out.println(D[1]+"\n"+D[2]);
}
}
import java.util.*;
class Main{
static int[] D;
static int d,k;
public static void main (String[] args) {
Scanner sc = new Scanner(System.in);
d = sc.nextInt();
k = sc.nextInt();
D = new int[d+1];
int left = 1, right = k;
while(left<right){
D[1] = left;
D[2] = right;
for(int i = 3; i<=d; i++){
D[i] = D[i-1]+D[i-2];
}
if(D[d] == k) break;
if(D[d] > k) right -= 1;
else left += 1;
}
System.out.println(D[1]+"\n"+D[2]);
}
}
'today's alogrithm' 카테고리의 다른 글
[BOJ] 1212번 8진수 2진수 - JAVA (0) | 2021.06.22 |
---|---|
[BOJ] 12852번 1로 만들기 2 - JAVA (0) | 2021.06.21 |
[BOJ] 1254번 팰린드롬 만들기 - JAVA (0) | 2021.06.17 |
[BOJ] 이분 탐색 단계 - JAVA (0) | 2021.02.06 |
[프로그래머스] SQL 고득점 Kit - oracle sql (0) | 2021.02.04 |