백준1697(숨바꼭질)

jh Seo·2022년 11월 30일
0

백준

목록 보기
90/180

개요

백준 1697번: 숨바꼭질

  • 입력
    첫 번째 줄에 수빈이가 있는 위치 N과 동생이 있는 위치 K가 주어진다. N과 K는 정수이다.

  • 출력
    수빈이가 동생을 찾는 가장 빠른 시간을 출력한다.

접근방식

  1. 수빈이가 움직이는 방향이 총 세 군데다.

  2. bfs방식을 이용해 이동한 타일 체크하고 다시 안가도록 하면서 세갈래로 나뉘면서 동생위치를
    갈 수 있는지 체크한다.

  3. n+1, n-1, n*2 이렇게 세가지를 일일이 체크 하는방식으로 구현했으나,
    함수 포인터를 사용한다면 일일이 안적고 한번에 정리가 가능했다.

#include<functional>

const function<int(int)> f[3] = {
	[](int n) {return n + 1; },
	[](int n) {return n - 1; },
	[](int n) {return 2 * n; }
};

for (int i = 0; i < 3; i++) {
	//함수 배열에서 가져와 씀
	int nextC = f[i](cur);
	

이런 식으로 functional 헤더를 사용함으로 function<> 함수포인터를 사용할 수 있다.

functional 헤더를 사용 안 한다면, 이런식으로 구현이 가능하다.

int (*f[3])(int);

void init() {
	f[0] = [](int n) {return n + 1; };
	f[1] = [](int n) {return n - 1; };
	f[2] = [](int n) {return 2 * n; };
}
int main()
{
	init();
    
}

이런식으로 함수포인터 배열에 넣어줄수 있다.

코드

#include<iostream>
#include<functional>
#include<queue>

using namespace std;
int soobin = 0, brother = 0;
//false로 초기화됨
bool visited[100'001];
//람다식으로 간단하게 구현
const function<int(int)> f[3] = {
	[](int n) {return n + 1; },
	[](int n) {return n - 1; },
	[](int n) {return 2 * n; }
};

void input() {
	cin >> soobin >> brother;

}

void solution() {
	//제자리일 경우 체크해주기
	if (soobin == brother) { cout << 0; return; }
	queue<int> q;
	q.push(soobin);
	visited[soobin] = true;
	int level = 1;
    //q가 빌 때까지 level++하며 반복한다
	for (; !q.empty(); level++) {
		int qSize = q.size();
		for (int i = 0; i < qSize; i++) {
			int cur = q.front();
			q.pop();
			for (int i = 0; i < 3; i++) {
				//함수 배열에서 가져와 씀
				int nextC = f[i](cur);

				if (nextC == brother) {
					cout << level;
					return;
				}

				if (nextC >= 0 && nextC <= 100'000) {
					if (!visited[nextC]) {
						visited[nextC] = true;
						q.push(nextC);
					}
				}

			}
		}

	}


}

int main() {
	input();
	solution();
}

문풀후생

함수포인터를 사용해 함수를 배열로 관리하는 게 신선했다.

자주 써먹어야겠다.

profile
코딩 창고!

0개의 댓글