fly me to the alpha... 문제풀이

fly me to the alpha... 문제풀이

2018, Apr 29    

백준에 있는 fly_me_to_the_alpha_centauri 를 풀어보았다.
사실 풀지 못하고 사람들이 풀이해준 걸 보고 풀었다. 그래도 어려웠다…
문제링크

#include <stdio.h>
#include <math.h>

/// x부터 y지점까지 도달하기 까지의 최소 워프 수를 출력하는 문제
/// 거리 차가 제곱 수 일 때 최대 워프 수가 1씩 늘어나는 규칙이 있음.
/// 거리차  최소워프수				최대 워프 거리
/// ex) 1 -> 1 ... 1						1
///		2 -> 2 ... 1 1						1
///		3 -> 3 ... 1 1 1					1
///		4 -> 3 ... 1 2 1					2
///		9 -> 5 ... 1 2 3 2 1				3
/// 거리차가 n^2 이면 최대 워프 거리는 n임.
/// 거리차가 n^2 이면 최소워프 수는 2*n -1 임.
///	최대 워프 이상 움직일 수 없음.
/// 나머지 거리를 구할 때는 나머리 거리를 최대 워프 거리로 나눈 몫을 올림하면 됌
/// ex) 거리가 5일때 -> 최대워프 거리가 2 이므로 2^2 거리를 가고 
/// 나머지 1거리는 최대 워프 거리로 나눈 몫을 올림한 값. 따라서 + 1 ... 3
/// 1 2 1 1
void fly_me_to_the_alpha_centauri(int x, int y)
{
	int goToPath = y - x;
	int standard = 1; /// 제곱이 될 수
	int maxWarp;
	int warpCnt;

	while (goToPath > pow(standard,2)) /// 남은 거리보다 크지 않은 n^2 의 n을 구한다.
		standard++;

	maxWarp = --standard; /// 구해야 할 n보다 1크므로 감소시켜 준다. 최대 워프 거리와 같다.
	goToPath -= pow(standard, 2); /// 앞으로 이동해야 할 거리를 구한다.
	warpCnt = 2 * standard - 1; /// 지금까지 이동한 워프 수를 구한다.

	while (goToPath > 0)	/// maxWarp로 나눈 몫을 올림한다. 남은 거리를 maxWarp로 빼면서 이동 거리를 1씩
	                        /// 증가 시킨다.
	{
		goToPath -= maxWarp;
		warpCnt++;
	}
		
	printf("%d", warpCnt);
}

int main()
{
	int cnt;
	scanf_s("%d", &cnt);
	for (int i = 0; i < cnt; i++)
	{
		int x;
		int y;
		scanf_s("%d", &x);
		scanf_s("%d", &y);
		fly_me_to_the_alpha_centauri(x, y);
		printf("\n");
	}
    return 0;
}