프론트엔드 개발 블로그

BOJ 1697 : 숨바꼭질

by heeji_

[문제]

- 수빈이 위치 N, 동생 위치 K로 나타낼 수 있다. (0<=N<=100,000)

- 수빈이는 1초 후 걷기 혹은 순간이동으로 X에서 X-1, X+1, 2*X로 이동한다.

- N과 K가 주어졌을 때 수빈이가 동생에게 도달할 수 있는 가장 빠른 시간

= 결국 N에서 K까지 연결된 노드를 따라 이동할 때 최단 거리 => BFS로 풀자

 

* 입력 : N, K 

* 출력 : N부터 K까지 최단 거리 (가장 빠른 시간)

 

[풀이]

- 현재 위치를 node라고 했을 때 next가 될 수 있는 것은

=> node+1, node-1, 2*node

- 위의 3개 노드를 bfs방식으로 탐색한다.

- node 또는 next가 map의 범위를 벗어나거나 node가 k, 즉 동생 위치에 도달했을 경우 continue

* 런타임에러 발생 원인 : node 예외처리만 해주고 next에 대해서 처리를 안해줘서 발생

 

[코드]

#include <iostream>
#include <queue>
#include <vector>
#include <cstring>
using namespace std;

const int MAX = 100001;
int n, k;
vector<int> map[MAX];
bool vis[MAX]; //방문 여부 확인
int dist[MAX]; //거리(초) 저장

void bfs(int start) {
	//초기화부분
	queue<int> q;
	memset(vis, false, sizeof(vis));
	memset(dist, 0, sizeof(dist));
	vis[start] = true;
	q.push(start);
	dist[start] = 0;
	//bfs시작
	while (!q.empty()) {
		int node = q.front();
		q.pop();

		int next;
		//예외처리
		if (node == k)break;
		if (node >= MAX||node<0)break;
		for (int i = 0; i < 3; i++) {
			//세가지 경우 나눠서 next결정
			if (i == 0) next = node + 1;
			if (i == 1) next = node - 1;
			if (i == 2) next = 2 * node;
			// next또한 map의 범위 밖에 나가면 안되므로 처리
			if (next >= MAX || next < 0) continue;
			
			if (vis[next] == false) {
				vis[next] = true;
				q.push(next);
				dist[next] = dist[node] + 1;
			}
		}
	}
}

int main() {
	cin >> n >> k;
	bfs(n);
	cout << dist[k] << "\n";
	return 0;
}

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

BOJ 16953 : A→B  (0) 2021.04.08
BOJ 7576 : 토마토 ☆  (0) 2021.04.07
BOJ 1012 : 유기농 배추  (0) 2021.04.07
BOJ 2178 : 미로탐색  (0) 2021.04.06
BOJ 14225 : 부분수열의 합  (0) 2021.03.31

블로그의 정보

아자아자

heeji_

활동하기