본문 바로가기

알고리즘/SWEA

8659

static long long table[91][2]; //실수했던 부분
static int K;

static void table_init(void)
{
	table[1][0] = 2;
	table[1][1] = 1;

	for (int i = 2; i <= 90; i++)
	{
		table[i][1] = table[i - 1][0];
		table[i][0] = table[i - 1][0] + table[i - 1][1];
	}
}

최대공약수는 유클리드 호제법을 이용하여 구할 수 있고, 그 방식은 아래와 같다.

 

a > b; gcd(a, b) = gcd(b, a % b)

a > b = 0; gcd(a, 0) = a

 

이렇게 재귀적으로 구할 수 있다.

 

문제에서는 해당작업의 반복횟수가 주어졌을 때, 그 횟수를 만족하는 여러개의 두 수의 집합 중,

a가 제일 작고, 제일 작은 a가 여러개 일 경우 제일 작은 b가 되는 집합을 출력하는 것이다.

 

그래서 시작을 (a, 0) 으로 잡고 시작했다.

여기서 a == 1로 하고 거슬러 올라가면 된다.

(1, 0) -> (2, 1) 이 되어야 한다.

즉, 후자에 경우 a 자리에 오는 것은 (b * 2)가 되어야 한다. b * 1은 조건 상 될 수 없고,

b * 3 이상으로 가면 a가 제일 작아야 된다는 정답 조건을 만족하지 못한다.

이 이후 부터는 (a1, b1) -> (a2, b2) 를 만든다고 했을 때,

b2 = a1, a2 = a1 + b1이 되어야 한다. a1 * n (n > 1) 로 해도 상관은 없지만 조건을 만족하지 못한다.

 

이번에는 a == 2로 한뒤 거슬러 올라가되 되기는 하지만 역시 조건을 만족하지 못한다.

 

위 알고리즘이 table_init()에 동작방식이다.

 

정리하고 보니  제일 작은 b는 사실 신경 쓸 필요가 없는 조건 같다.

 

그리고 입력으로 주어지는 K가 최대 90까지 인데,

이렇게 누적해나가는 방식으로 int에서 오버플로우가 나는지 예상하지 못했다.

주의해야 할 만한 부분이다.

 

 

'알고리즘 > SWEA' 카테고리의 다른 글

8673  (0) 2021.11.08
2112  (0) 2021.11.08
8658  (0) 2021.11.08
5650  (0) 2021.11.08
1949  (0) 2021.11.08