알고리즘/BOJ

백준 12851번 숨바꼭질 2

lheunoia 2021. 1. 16. 17:34

 

 

 

문제 보러가기 : https://www.acmicpc.net/problem/12851 

 

 

 

12851번: 숨바꼭질 2

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

www.acmicpc.net

 

 

이번 문제는 너비 우선 탐색(BFS) 문제였습니다.

 

 

 

《문제 풀이》

 

1. { N, 0 } 을 큐에 삽입 (0은 경과 시간)

2. 동생을 가장 빠른 시간으로 찾는 방법의 수를 구해야 하므로 pop 이후에 방문 체크 

3. 수빈이가 갈 수 있는 세 가지 위치가 범위에 충족되면 큐에 삽입

4. 최초로 동생 위치에 도달한 경우, 경과 시간을 result에 저장 후, cnt = 1

5. 이전에 동생 위치에 도달한 적이 있는 경우, cnt++

 

 

 

C++ 코드》

 

#include <iostream>
#include <queue>
#define MAX 100001

using namespace std;

int cnt;
int result;
bool visited[MAX];

void hiding(int from, int to) {
	queue<pair<int, int>> q;
	q.push({from, 0});    
	visited[from] = true;
	
	while(!q.empty()) {
		int loc = q.front().first;
		int time = q.front().second;
		q.pop();
		
		visited[loc] = true;
		
		// 이전에 동생위치에 도달한적이 있는 경우  
		if(result == time && loc == to)
			cnt++;
		
		// 최초로 동생위치에 도달한 경우   
		if(!result && loc == to) {
			result = time;
			cnt = 1;
		}
		
		if(0 <= loc-1 && !visited[loc-1]) 
			q.push({loc-1, time+1});	
			
		if(loc+1 < MAX && !visited[loc+1]) 
			q.push({loc+1, time+1});
	
		if(loc*2 < MAX && !visited[loc*2]) 
			q.push({loc*2, time+1});   		
	}
}

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

	int N, K;
	cin>>N>>K;
	hiding(N, K);
	cout<<result<<"\n"<<cnt;
	
	return 0;
}

 

개발 환경: Dev-C++ 

 

 

 

baekjoon - 정답 화면

 

 

반응형

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

백준 10830번 행렬 제곱  (0) 2021.01.18
백준 13549번 숨바꼭질 3  (0) 2021.01.16
백준 16953번 A → B  (0) 2021.01.16
백준 15663번 N과 M (9)  (0) 2021.01.11
[백준] 15654번 N과 M (5) C++  (0) 2021.01.09