https://www.acmicpc.net/problem/1697
프로그래머스 문제를 풀고 이문제를 푸니 너무 쉽게 느껴졌다 알고리즘 수련이 아주 부족하다고 느껴졌다 더 열심히 해서 제발 취업을 애햐하는데 이문제의 경우는 문제의 답으로 최소경로수를 원하는 것이기 때문에 최소 경우의 수를 확정적으로 반환해주는 BFS를 사용해주어야 한다 이문제 자체는 실버 1이지만 문제도 짧고 해서 이해하기가 매우 편했다. 이 문제의 경우 bfs를 총 3가지 경우로 짜주면 그냥 해결되는 문제열다 X-1 ,X+1 ,2*X 자기 자신에대해서 자식이 이렇게
만들어지기 떄문에 bfs의 범위를 이렇게 3개씩 넓혀주면 빠르게 끝난다.
BFS의 특징으로는 큐를 사용하면 매우 편해진다는 장점이 있다 이문제의 경우도 마찬가지다 큐를 사용해서 자기를 없애면서 자기자식은 큐에 넣게되면 BFS가 된다 이전 문제에서도 큐를 이용해서 풀었기 때문에 이번문제도 큐를 이요했지만 이번에는 visited 배열에 자기가 몇대손인지를 넣을 수 있게 코드를 짜보았다
#include <iostream>
#include <queue>
using namespace std;
int visited[200002];
int N, K;
int main() {
cin >> N >> K;
queue<int> hs;
hs.push(N);
visited[N] = 0;
while (true) {
if (hs.front() == K) {
break;
}
if (hs.front() > 0) {
if (!visited[hs.front() - 1]) {
hs.push(hs.front() - 1);
visited[hs.front() - 1] = visited[hs.front()] + 1;
}
}
if (hs.front() < 100000) {
if (!visited[hs.front() + 1]) {
hs.push(hs.front() + 1);
visited[hs.front() + 1] = visited[hs.front()] + 1;
}
}
if (hs.front() <= 50000) {
if (!visited[hs.front() * 2]) {
hs.push(hs.front() * 2);
visited[hs.front() * 2] = visited[hs.front()] + 1;
}
}
hs.pop();
}
cout << visited[K];
}