본문 바로가기
에러 잡기/문제 풀이

백준 1697 숨바꼭질

by HJINHA 2021. 3. 24.

www.acmicpc.net/problem/1697

 

1697번: 숨바꼭질

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

www.acmicpc.net

BFS를 이용해서 풀었는데 자꾸 틀렸습니다가 뜸

 

시작점(N)에 다시 방문하지 않게 하기 위해 visited[N]을 1로 넣고 시작했더니 [1 1] 같은 케이스에서 0이 아닌 2가 출력된 것이었음.

bfs 앞부분에 같으면 0 출력하고 종료하는 코드를 넣으니까 풀렸다.

visited랑 몇번째 방문인지 체크하는 배열을 따로 선언해야 하나 고민중

 

 사실 visited가 0이 아니면 무조건 방문한 거니까 거기에 몇번째 방문인지 체크하는게 메모리 효율은 좋을텐데, 고려해야 할 사항이 늘어나서 번거롭기도 하다.

 

 

#include<iostream>
#include<queue>
using namespace std;
int n, k;

int visited[200001];

void bfs() {
	if (n == k) {
		cout << 0 << endl;
		return;
	}
	queue<int> q;
	q.push(n);
	visited[n] = 1;
	while (!q.empty()) {
		int cur = q.front();
		q.pop();
		if ((cur + 1) == k || (cur - 1) == k || (cur * 2) == k) {
			cout << visited[cur] << endl;
			return;
		}
		if ((cur + 1) <200000 && visited[cur + 1] == 0) {
			q.push(cur + 1);
			visited[cur + 1] = visited[cur] + 1;
		}
		if ((cur + 1) >= 0 && visited[cur - 1] == 0) {
			q.push(cur - 1);
			visited[cur - 1] = visited[cur] + 1;
		}
		if ((cur * 2) < 200000 && visited[cur * 2] == 0) {
			q.push(cur * 2);
			visited[cur * 2] = visited[cur] + 1;
		}
	}
}

int main() {
	cin >> n >> k;
	bfs();
	return 0;
}

 

'에러 잡기 > 문제 풀이' 카테고리의 다른 글

백준 13913 숨바꼭질4  (0) 2021.04.09
백준 12851 숨바꼭질 2  (0) 2021.04.03
백준 16953 A->B  (0) 2021.03.30
백준 7562 나이트의 이동  (0) 2021.03.26
백준 1012 유기농 배추  (0) 2021.03.24

댓글