728x90

문제

수빈이는 동생과 숨바꼭질을 하고 있다. 수빈이는 현재 점 N(0 ≤ N ≤ 500,000)에 있고, 동생은 점 K(0 ≤ K ≤ 500,000)에 있다. 수빈이는 걷거나 순간이동을 할 수 있다. 만약, 수빈이의 위치가 X일 때 걷는다면 1초 후에 X-1 또는 X+1로 이동하게 된다. 순간이동을 하는 경우에는 1초 후에 2*X의 위치로 이동하게 된다. 동생은 항상 걷기만 한다. 동생은 항상 매 초마다 이동을 하며, 이동은 가속이 붙는다. 동생이 이동하는 거리는 이전에 이동한 거리보다 1을 더한 만큼 이동한다. 즉, 동생의 처음 위치는 K, 1초가 지난 후 위치는 K+1, 2초가 지난 후 위치는 K+1+2, 3초가 지난 후의 위치는 K+1+2+3이다.

수빈이와 동생의 위치가 주어졌을 때, 수빈이가 동생을 찾을 수 있는 가장 빠른 시간이 몇 초 후인지 구하는 프로그램을 작성하시오. 동생을 찾는 위치는 정수 좌표이어야 하고, 수빈이가 0보다 작은 좌표로, 50만보다 큰 좌표로 이동하는 것은 불가능하다.

입력

첫 번째 줄에 수빈이가 있는 위치 N과 동생이 있는 위치 K가 주어진다. N과 K는 정수이다.

출력

수빈이가 동생을 찾는 가장 빠른 시간을 출력한다. 수빈이가 동생을 찾을 수 없거나, 찾는 위치가 500,000을 넘는 경우에는 -1을 출력한다.


길고 긴 숨바꼭질 bfs 문제의 끝이다. 마지막 답게 가장 어려운 문제이다. 

동생은 계속 위치를 바꾸고 그 시간까지 맞춰서 수빈이가 동생을 찾아야 한다. 

주의할 점은 수빈이는 거리를 +1, -1로 2초만에 제자리에 다시 올 수 있기 때문에 방문 여부를 나타내는 배열을 2차원으로 설정해야 한다. 

그래서 짝수일 때 방문한 것과 홀수일 때 방문한 것을 차이점을 줘야 한다.

짝수일 때 방문한 지점과 동생의 위치가 같다면 만날 수 있으나 홀수, 짝수일 땐 만날 수 없으므로 이를 주의한다.

 

코드 원본 : https://github.com/chosh95/STUDY/blob/master/BaekJoon/%EC%88%A8%EB%B0%94%EA%BC%AD%EC%A7%88%205.cpp

 

chosh95/STUDY

알고리즘 문제풀이. Contribute to chosh95/STUDY development by creating an account on GitHub.

github.com

C++ 코드

#include <iostream>
#include <queue>
#include <cstring>
using namespace std;
int N, K, res = -1;
bool visit[2][500001] = { false }; //Ȧ¼ö¹ø°, ¦¼ö¹ø°

void bfs()
{
	queue<int> q;
	q.push(N);
	int time = 1;
	visit[0][N] = true;
	while (!q.empty()) {
		K += time;
		if (K > 500000) return;
		if (visit[time % 2][K]) {
			res = time;
			return;
		}
		int size = q.size();
		for (int i = 0; i < size; i++) {
			int x = q.front();
			q.pop();
			for (int nx : {x - 1, x + 1, 2 * x}) {
				if (nx == K) {
					res = time;
					return;
				}
				if (nx < 0 || nx>500000) continue;
				if (visit[time % 2][nx]) continue;
				visit[time % 2][nx] = true;
				q.push(nx);
			}
		}
		time++;
	}
}


int main()
{
	cin >> N >> K;
	if (N == K) {
		cout << "0";
		return 0;
	}
	memset(visit, false, sizeof(visit));
	bfs();
	cout << res;
}

 

728x90

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

[백준] 과자 나눠주기 (16401번)  (0) 2020.01.22
[백준] 적록색약 (10026번)  (0) 2020.01.20
[백준] 숨바꼭질 4 (13913번)  (0) 2020.01.19
[백준] 숨바꼭질 3 (13549번)  (0) 2020.01.19
[백준] 숨바꼭질2 (12851번)  (0) 2020.01.19

+ Recent posts