입력
첫 번째 줄에 수빈이가 있는 위치 N과 동생이 있는 위치 K가 주어진다. N과 K는 정수이다.
출력
수빈이가 동생을 찾는 가장 빠른 시간을 출력한다.
수빈이가 움직이는 방향이 총 세 군데다.
bfs방식을 이용해 이동한 타일 체크하고 다시 안가도록 하면서 세갈래로 나뉘면서 동생위치를
갈 수 있는지 체크한다.
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();
}
함수포인터를 사용해 함수를 배열로 관리하는 게 신선했다.
자주 써먹어야겠다.