Deff_Dev

[백준] 1697번 숨바꼭질 (C++) 본문

코딩테스트/백준

[백준] 1697번 숨바꼭질 (C++)

Deff_a 2024. 3. 1. 01:00
 

1697번: 숨바꼭질

수빈이는 동생과 숨바꼭질을 하고 있다. 수빈이는 현재 점 N(0 ≤ N ≤ 100,000)에 있고, 동생은 점 K(0 ≤ K ≤ 100,000)에 있다. 수빈이는 걷거나 순간이동을 할 수 있다. 만약, 수빈이의 위치가 X일

www.acmicpc.net

 

문제 

이 문제는 BFS를 사용하여 각 위치별 이동 시간을 계산한 후, 동생이 있는 위치에 도달할 때까지의 이동 시간을 출력하는 방법으로 풀이하면 된다.

 

풀이

#include<iostream>
#include<queue>

// https://www.acmicpc.net/problem/1697 1697번 숨바꼭질
using namespace std;

bool visited[100001] = { false , };
int result[100001] = { 0 , }; // 횟수를 저장하는 배열
int N, K;


void BFS() {
	queue<int> Q;

	Q.push(N); // 시작 지점 푸쉬
	visited[N] = true;

	while (!Q.empty()) {
		int front = Q.front();
		Q.pop();

		if (front == K) { // 현재 위치가 동생의 위치일 때 break
			cout << result[K] << endl;
			break;
		}

		if (front - 1 >= 0 && !visited[front - 1]) { // 뒤로가기
			result[front - 1] = result[front] + 1; // 해당 위치까지의 이동 횟수 저장
			visited[front - 1] = true; // 방문 표시
			Q.push(front - 1); // 이동 위치 큐에 저장
		}

		if (front + 1 <= 100000 && !visited[front + 1]) { // 앞으로 가기
			result[front + 1] = result[front] + 1; // 해당 위치까지의 이동 횟수 저장
			visited[front + 1] = true;  // 방문 표시
			Q.push(front + 1);  // 이동 위치 큐에 저장
		}

		if (front * 2 <= 100000 && !visited[front * 2]) { // 순간 이동
			result[front * 2] = result[front] + 1; // 해당 위치까지의 이동 횟수 저장
			visited[front * 2] = true;  // 방문 표시
			Q.push(front * 2);  // 이동 위치 큐에 저장
		}
	}
}
int main() {
	cin >> N >> K;

	BFS();

	return 0;
}​

 

'코딩테스트 > 백준' 카테고리의 다른 글

[백준] 2178번 미로탐색 (C++)  (0) 2024.03.01
[백준] 9012번 괄호 (C++)  (0) 2024.03.01
[백준] 11399번 ATM (C++)  (0) 2024.03.01
[백준] 1260번 DFS와 BFS (C++)  (0) 2024.02.29
[백준] 1152번 단어의 개수 (C++)  (0) 2024.02.28