today's alogrithm

[BOJ] 2502번 떡 먹는 호랑이 - JAVA

UR'im 2021. 6. 18. 17:50

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]);
	}
}

아무래도 코드 줄이는 법을 생각해야겟따,,,