https://www.acmicpc.net/problem/1011
1011번: Fly me to the Alpha Centauri
우현이는 어린 시절, 지구 외의 다른 행성에서도 인류들이 살아갈 수 있는 미래가 오리라 믿었다. 그리고 그가 지구라는 세상에 발을 내려 놓은 지 23년이 지난 지금, 세계 최연소 ASNA 우주 비행
www.acmicpc.net
● 문제
● 접근 방법
k(n) = k(n-1) - 1 or k(n-1) or k(n-1) + 1 이다.
한마디로 다음 거리는 이전 거리보다 ±1 또는 같다.
현재위치 x와 목표위치 y와의 거리는 y - x이다.
첫 이동과 마지막 이동은 무조건 1이다.
다음 표와 같이 y-x의 거리에서 나올 수 있는 최대 이동 거리는 거리의 제곱근 [내림] 이다.
이 규칙을 찾을 때, 많은 시간을 들였다.
이때 표를 확인해보면 제급수를 지날 때, count가 1 증가하는 것을 확인 할 수 있다.
그렇다면 max ^ 2을 생각해보자.
distance가 3일때, 3의 제곱근은 1.7xxx, 올림하면 2이다.
이 2(max)의 제곱은 4라는 것을 알 수있다. 그 값에 -1을 하면 count가 나오는 것을 확인할 수 있다.
▶ 하지만 굳이 max값을 올림을 해야할까?
여기서 나는 distance의 제곱근을 올리지 않고 계산한 후, 올림을 하였다.
distance가 3 일때 max 값은 1.73xxx 이다. 이곳에 1을 뺀 0.73xxx을 더하면 2.46xxx이다.
이것을 Math.ceil을 이용하여 올려주고, 형변환을 시켜주면, 이게 또 잘먹힌다.
결론 : max값을 올림 후 계산하든 max값을 올리지 않고 계산하든 식만 다를뿐 원리는 비슷하다.
● 문제 풀이
import java.util.Scanner;
public class Main {
public static void main(String[] args) {
long x, y;
long a = 0;
//입력
Scanner sc = new Scanner(System.in);
int t = sc.nextInt();
// 테스트 케이스
for(int i = 0; i < t; i++) {
//입력
x = sc.nextInt();
y = sc.nextInt();
//풀이
double length = Math.sqrt(y - x);
int answer = (int)Math.ceil(length + (length - 1));
//출력
System.out.println(answer);
}
}
}
'백준' 카테고리의 다른 글
[백준] 1032번 : 명령 프롬프트 [Java] (0) | 2022.08.25 |
---|---|
[백준] 2501번 : 약수 구하기 [Java] (0) | 2022.08.25 |
[백준] 1009번 : 분산처리 [Java] (0) | 2022.08.25 |
[백준] 1008번 : A/B [Java] (0) | 2022.08.25 |
[백준] 1003번 : 피보나치 함수 [Java] (0) | 2022.08.24 |