1697 숨바꼭질.

2022. 12. 21. 17:06boj

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

 

1697번: 숨바꼭질

수빈이는 동생과 숨바꼭질을 하고 있다. 수빈이는 현재 점 N(0 ≤ N ≤ 100,000)에 있고, 동생은 점 K(0 ≤ K ≤ 100,000)에 있다. 수빈이는 걷거나 순간이동을 할 수 있다. 만약, 수빈이의 위치가 X일

www.acmicpc.net

 

문제를 처음 봤을때 3가지 +1, -1, *2 를 다 보면서 deque에 집어넣고 계산한 결과를 

사실 여기서 제대로 로직을 발견하지 못하여서 

처음에는 3개마다 재귀를 돌았기 때문에 로직상 오류가 발생했고 이를 해결 하고자 하였으며 이것이 곳 bfs의 처리 방식이라는 것을

확인 할 수 있었다.

하나씩 찾아보면서 정답을 발견하면 리턴하게 했다. 처음 맥시멈으로 가지고 있는 길이가 100000만 까지 였기 때문에

넉넉하게 잡아서 1000001보다 큰 값을 처리하고, 사실 처음 올바른 값을 찾으면 그값이 정답이 될 것 이기 때문에 

dq를 전달해서 처리하도록 구현하였다.

 

#include <iostream>
#include <queue>

using namespace std;

char check[1000001];

int solve(deque<int>& dq,  int m, int cnt) {
    int len;
    int value;

    len = dq.size();
    for (int i = 0; i < len; ++i) {
        value = dq[0];
        if (value > 0 && check[value - 1] == 0)
            dq.push_back(value - 1);
        if (value < 100000 && check[value + 1] == 0)
            dq.push_back(value + 1);
        if (value <= 50000 && check[value * 2] == 0)
            dq.push_back(value * 2);
        dq.pop_front();
        check[value] = 1;
    }
    for (int i = 0; i < dq.size(); ++i) {
        if (dq[i] >= 0 && dq[i] <= 1000000)
        {
            check[dq[i]] = 1;
            if (dq[i] == m)
                return (cnt);
        }
    }
    return (solve(dq, m, cnt + 1));
}

'boj' 카테고리의 다른 글

7576 tomato  (2) 2022.12.24
1063 번 킹.  (0) 2022.12.23
1021 회전하는 큐.  (0) 2022.12.21
수열의 합 1024  (0) 2022.12.21
1012 유기농 배추.  (0) 2022.12.20