CS/Algorithm 문제

[BaekJoon] 백준 1697번 숨바꼭질

 

[BaekJoon] 백준 1697번 숨바꼭질

 

 

문제: https://www.acmicpc.net/problem/1697

 

 

내코드

 

 

- bfs문제인데 인접한 값 == 수빈이가 이동할 수 있는 위치(즉, 수빈이의 현재 위치를 x라고 하면 x-1, x+1, x*2)으로 생각하고 풀면 간단한 문제.

- 처음에 런타임 에러가 나서 왜 그런가 봤더니 수빈이가 이동하는 위치가 100,000을 넘어가면 visited에서 배열의 범위가 초과되기 때문에 나는 거였다.

- 그리고 틀렸다고 나와서 이번에는 수빈이와 동생의 위치가 같을 때를 따로 조건을 걸어주었다.

- 배열을 초기화 할때 bool visited = { false, }이런식으로 하니까 전체가 같은 값으로 초기화가 됨.

- 아래는 아이패드에 정리한 내용.

 

백준 1697번 숨바꼭질.pdf
2.24MB

#include <iostream>
#include <stdio.h>
#include <string>
#include <queue>
#include <utility>

using namespace std;

int n, k;
queue<pair<int, int>> qu;
bool visited[100001] = { false, };
pair<int, int> current;

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

	cin >> n >> k;
	if (n == k) {
		cout << 0;
		return 0;
	}
	qu.push(make_pair(n, 0));
	visited[n] = true;

	while (!qu.empty()) {
		current = qu.front();
		qu.pop();
		int x = current.first;
		int y = current.second;
		if (x-1 >= 0 && visited[x - 1] == false) {
			if ((x - 1) == k) {
				cout << y + 1;
				return 0;
			}
			qu.push(make_pair(x - 1, y + 1));
			visited[x - 1] = true;
		}
		if (x+1 <= 100000 && visited[x + 1] == false) {
			if ((x + 1) == k) {
				cout << y + 1;
				return 0;
			}
			qu.push(make_pair(x + 1, y + 1));
			visited[x + 1] = true;
		}
		if (x*2 <= 100000 && visited[x * 2] == false) {
			if ((x * 2) == k) {
				cout << y + 1;
				return 0;
			}
			qu.push(make_pair(x * 2, y + 1));
			visited[x * 2] = true;
		}
	}
	return 0;
}

 

참고

728x90
반응형

'CS > Algorithm 문제' 카테고리의 다른 글

[BakJoon] 백준 7569번 토마토  (0) 2020.03.08
[BaekJoon] 백준 7576번 토마토  (0) 2020.03.08
[BaekJoon] 백준 2178번 미로탐색  (0) 2020.02.25
[BaekJoon] 백준 1926번 그림  (0) 2020.02.21
[BaekJoon]백준 2493번 탑  (0) 2020.01.28