본문 바로가기
코딩테스트/백준

백준 12851] C++ 숨바꼭질2

by Hwan2 2020. 11. 6.
728x90
반응형

해당 문제는 백준 사이트에서 풀 수 있습니다.


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


1. 문제

수빈이는 동생과 숨바꼭질을 하고 있다. 수빈이는 현재 점 N(0 ≤ N ≤ 100,000)에 있고, 동생은 점 K(0 ≤ K ≤ 100,000)에 있다.

수빈이는 걷거나 순간이동을 할 수 있다. 만약, 수빈이의 위치가 X일 때 걷는다면 1초 후에 X-1 또는 X+1로 이동하게 된다. 

순간이동을 하는 경우에는 1초 후에 2*X의 위치로 이동하게 된다.

수빈이와 동생의 위치가 주어졌을 때, 수빈이가 동생을 찾을 수 있는 가장 빠른 시간이 몇 초 후인지 그리고, 

가장 빠른 시간으로 찾는 방법이 몇 가지 인지 구하는 프로그램을 작성하시오.

입력

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

출력

첫째 줄에 수빈이가 동생을 찾는 가장 빠른 시간을 출력한다.

둘째 줄에는 가장 빠른 시간으로 수빈이가 동생을 찾는 방법의 수를 출력한다.

예제 입력 1 

5 17

예제 출력 1 

4
2

출처



2. 조건

1. 수빈이는 동생에게 가기위해 1초에 이동할 수 있는 경우의 수는 3가지이다.
2. 수빈이의 위치를 X라고 둘 때 1초 동안 갈 수 있는 곳은 X + 1, X - 1, X * 2 총 3가지이다.
3. 수빈이가 동생에게 갈 수 있는 가장 빠른 시간은 몇초인가?
4. 가장 빠른 시간을 구했다면 가장 빠른 시간으로 갈 수 있는 경우의 수는 몇가지 인가?


3. 풀이

숨바꼭질 : https://hwan-shell.tistory.com/278?category=865063


위 문제와 비슷한 문제입니다.


해당 문제는 bfs로 풀면 간단하게 풀 수 있습니다.


수빈이가 갈 수 있는 모든 방법들 ( X + 1, X - 1, X * 2 )를 큐에 모두 때려 박고

동생 위치가 나올 때 까지 계속 돌리면서 가장 먼저 일치하는 값이 나오면 해당 값에 대한 cost값을

구하면 됩니다.


왜냐면 bfs의 특징은 너비탐색이기 때문에 각 최단 위치에서 갈 수 있는 범위를 탐색하는 것이기 때문입니다.

(이해가 잘 안가시려나?....)


여튼 저는 여기에 bool을 만들어 중복 검사를 막아줬습니다.

왜냐면 같은 값이 나오게 된다면 같은 작업을 또 반복하기 때문이죠.


cost값을 구했다면 해당 cost에 도달할 수 있는 경우의 수를 구해주면 됩니다.

즉, cost값이 4가 나왔다면 cost가 4인 경우 중에서 목적지에 도착하는 갯수를 구해주면 됩니다.


4. 코드

#include <iostream>
#include <vector>
#include <queue>

#pragma warning(disable4996)

using namespace std;

bool isCheck[100010];

int main() {
    int T;
    int N, M, K;
    int X, Y;
    int answer = 0;
    int answer_count = 0;

    cin >> N >> K;
    queue<pair<intint>> q;
    q.emplace(N, 0);

    while (!q.empty()) {
        int locate = q.front().first;
        int cost = q.front().second;
        q.pop();

        isCheck[locate] = true;
        isCheck[K] = false;

        if (answer == 0 && locate == K) {
            answer = cost;
            answer_count++;
            continue;
        }

        if (answer != 0 && answer == cost && locate == K) {
            answer_count++;
            continue;
        }

        if (0 <= locate - 1 && !isCheck[locate - 1])
            q.emplace(locate - 1, cost + 1);


        if (locate + 1 <= K && !isCheck[locate + 1])
            q.emplace(locate + 1, cost + 1);


        if (locate * 2 <= K + 1 && !isCheck[locate * 2])
            q.emplace(locate * 2, cost + 1);

    }

    cout << answer << endl;
    cout << answer_count << endl;
    return 0;
}



반응형

'코딩테스트 > 백준' 카테고리의 다른 글

백준 13913] C++ 숨바꼭질4  (0) 2020.11.08
백준 13549] C++ 숨바꼭질3  (0) 2020.11.07
백준 1697] C++ 숨바꼭질  (0) 2020.11.05
백준 14719] C++ 빗물  (0) 2020.11.04
백준 19236] C++ 청소년 상어  (3) 2020.10.16

댓글


스킨편집 -> html 편집에서