개인사

[G5] 백준 1011번 Fly me to the Alpha Centauri C++ 수학, 투 포인터 본문

알고리즘 공부/C++

[G5] 백준 1011번 Fly me to the Alpha Centauri C++ 수학, 투 포인터

마달랭 2025. 10. 29. 17:05
728x90

리뷰

 

https://www.acmicpc.net/problem/1011

가운데서 만나는 시간을 구하는 전략을 수립했는데 싱겁게 맞아버렸다.

 

 

전역 변수

  • t : 테스트 케이스의 개수를 저장할 변수
  • x, y : 두 행상의 위치를 저장할 변수

 

함수

없음

 

 

문제풀이

  1. t값을 입력 받고, t번의 테스트케이스를 수행한다.
  2. 매 테스트케이스마다 변수 x, y를 입력 받는다.
  3. 기저 조건으로 y-x가 1일 경우 1을 출력하고 다음 테스트케이스를 수행한다.
  4. 변수 move를 0으로 초기화하고, dist를 1로 초기화한다.
  5. x가 y보다 작을 경우 while루프를 수행한다.
  6. x에 dist를 더하고, move를 증가시킨다. x가 y이상이면 break처리한다.
  7. y에 dist를 빼고, move를 증가시킨다. x가 y이상이면 break처리한다.
  8. dist값을 증가시킨다.
  9. while루프가 종료된 후 move를 출력 후 개행문자를 삽입해준다.

 

트러블 슈팅

없음

 

 

참고 사항

  1. 입력값이 많아보인다, 빠른 입출력을 사용하는 것을 추천한다.
  2. 포인터를 양쪽 끝에서 시작하여 중간에서 만나는 최단 시간을 구해주었다.

 

정답 코드

#include<iostream>
using namespace std;

int t, x, y;

int main() {
	ios::sync_with_stdio(0);
	cin.tie(0);
	cout.tie(0);

	cin >> t;
	while (t--) {
		cin >> x >> y;
		if (y - x == 1) {
			cout << 1 << "\n";
			continue;
		}

		int move = 0;
		int dist = 1;
		while (x < y) {
			x += dist;
			++move;
			if (x >= y) break;

			y -= dist;
			++move;
			if (x >= y) break;

			++dist;
		}
		cout << move << "\n";
	}
}
728x90