[C++]숨바꼭질 - 백준1697

문제



풀이

문제 해석을 하자면,

  • 수빈이와 동생의 위치가 주어지면, 수빈이가 몇초를 이동해야 동생의 위치를 찾을 수 있는지 구하는 문제이다.
  • 복잡도가 클거 같지는 않다는 생각에 “브루트포스”로 구현해보겠다.


풀이

  • BFS를 상황에 맞게 진행한다.
    • 예로 수빈이가 동생보다 위치가 크다면 X-1, X+1, X*2 동작을 진행하자.
    • 이때, 중요한것은 이렇게 변화한 위치들도 “큐”에 넣어서 접근해봐야 하기 때문에
    • inArr을 Vector 배열로 선언해서 변화 위치들을 전부 기록후 “큐”에 inArr의 index값을 기록해서 사용한다.
  • 모든 경우를 따진 후 가장 최소의 시간을 구한다.
    • 이때, 시간을 따로 배열을 선언해서 기록해둔다.
    • BFS 특성상 최소시간을 구하기 위해선 최초로 접근한 시간만 기록하면 된다.



코드

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

int outArr[100005]; // time 기록
bool visited[100005];
vector<int> inArr[100005];

int N, K; // 수빈, 동생 위치
int i, j, k;

void bfs();

int main() {
	// input
	cin >> N >> K;

	// run
	if (N != K) { // 혹시 처음부터 위치 동일한 경우 예외
		visited[N] = true;
		inArr[N].push_back(N - 1);
		inArr[N].push_back(N + 1);
		inArr[N].push_back(N * 2);
		bfs();
	}
	
	// output
	cout << outArr[K];

	return 0;
}

void bfs() {
	queue<int> qu;
	int cx = 0;
	int px = 0;

	qu.push(N); // 시작점 : 수빈 위치

	while (!qu.empty()) {
		cx = qu.front();
		qu.pop();
		//cout << cx << ' ';

		for (auto nx : inArr[cx]) { // inArr[cx] 에 존재하는 값 전부 조회
			if (nx < 0 || nx>100000) continue; // 범위 내 체크
			if (outArr[nx] != 0) continue; // 값이 이미 있는경우 할 필요 없음.

			if (!visited[nx]) {
				visited[nx] = true;
				inArr[nx].push_back(nx - 1);
				inArr[nx].push_back(nx + 1);
				inArr[nx].push_back(nx * 2);
			}

			outArr[nx] = outArr[cx] + 1; // 1초 경과
			qu.push(nx);

			// 동생을 찾은경우? 종료
			if (nx == K) return;
		}
	}
}



느낀점

생략

댓글남기기