Algorithm/baekjoon
[BOJ 1011] Fly me to the Alpha Centauri
식빵민
2022. 8. 3. 02:53
1011번: Fly me to the Alpha Centauri
우현이는 어린 시절, 지구 외의 다른 행성에서도 인류들이 살아갈 수 있는 미래가 오리라 믿었다. 그리고 그가 지구라는 세상에 발을 내려 놓은 지 23년이 지난 지금, 세계 최연소 ASNA 우주 비행
www.acmicpc.net
문제 분석
- 이동 해야 하는 거리 d = y - x, 이동 장치 작동 횟수 최솟값 : m
- 순간 이동은 1씩 증가시킬 수 있다.
- d = 1 ( m = 1 ), d = 2 = 1 + 1 ( m = 2 )
d = 3 = 1 + 1 + 1, d = 4 = 1 + 2 + 1 ( m = 3 )
d = 5 = 1 + 2 + 1 + 1, d = 6 = 1 + 2 + 2 + 1 ( m = 4 )
....
1 + 2 + ... + n-1 + n-1 + n-2 ... + 1 + 1 ( m = 2n-1 )
..
1 + 2 + ... + n-1 + n-1 + n-1 ... + 2 + 1 ( m = 2n-1 )
1 + 2 + ... + n-1 + n + n-1 ... + 2 + 1 ( m = 2n-1 )
1 + 2 + ... + n-1 + n + n-1 ... + 2 + 1 + 1 ( m = 2n )
....
1 + 2 + ... + n-1 + n + n + n-1 ... + 2 + 1 ( m = 2n )
∴ m이 2n - 1 혹은 2n 인 경우의 가짓수는 2n이다. -> 2n씩 증가 : { 2, 6, 12, 20 .... } - { 2 = 2(1), 6 = 2(1+2), 12 = 2(1+2+3), 20 = 2(1+2+3+4), .... , 2* ∑₍ᵢ₌₁..ₙ₎ i = 2 *[( n+1)n / 2 ] = n² + n }
풀이 방식
- n² + n 의 수열 정수형 배열로 저장
- d = y - x
- "(n-1)² + (n-1) = n² - n ≤ d ≤ n² + n" 인 n을 반복문을 이용해 찾는다.
- d ≤ n² : m = 2n - 1
- d > n² : m = 2n
#include <iostream>
#define MAX 47000 // >= 2³¹ + √(2³¹)
using namespace std;
int t, x, y;
long long d;
long long arr[MAX + 1];
int main() {
ios::sync_with_stdio(0);
cin.tie(0);
for (long long i = 1; i <= MAX; i++) {
arr[i] = (i * i + i);
}
cin >> t;
while (t--) {
cin >> x >> y;
d = y - x;
if (d == 1) {
cout << 1 << "\n";
continue;
}
for (long long i = 1; i <= MAX; i++) {
if (d > arr[i - 1] && d <= arr[i]) {
if (d <= i * i) cout << 2 * i - 1 << '\n';
else cout << 2 * i << '\n';
break;
}
}
}
return 0;
}
느낀 점
- 문제를 풀기전에 문제를 분석하며 분명 규칙이 있다는 것을 느꼈고, 그것을 파악하는데에는 오랜시간이 걸리진 않았다.
- 하지만 규칙을 일반화하기 어려웠고 일반화하는 데에 시간이 오래 걸렸다. (n² + n)
- 규칙을 파악하고 코드로 옮기는 건 금방 했다.
- 문제를 분석하여 규칙을 찾아 일반화하는 것이 얼마나 중요한 지 느끼게 해주는 문제였다.
시간 복잡도 : O (MAX = 47000 ) , 47000 (>= 2³¹ + √(2³¹) )