문제 링크

  • 내 풀이

이동했던 위치를 기록하고 중복이동 하지 않도록 막고 큐에 이동 횟수와 위치를 기록했다.

#define _CRT_SECURE_NO_WARNINGS

#include <iostream>
#include <queue>

using namespace std;

int F, S, G, U, D;
int ck[1000001];

int solve()
{
    queue<pair<int, int>> q;

    q.push({ S, 0 });
    ck[S] = 1;

    while (!q.empty())
    {
        int cur = q.front().first;
        int cnt = q.front().second;
        q.pop();

        if (cur == G)
            return cnt;

        cnt += 1;
        if (cur + U <= F && !ck[cur + U])
        {
            q.push({ cur + U, cnt });
            ck[cur + U] = 1;
        }
        if (cur - D > 0 && !ck[cur - D])
        {
            q.push({ cur - D, cnt });
            ck[cur - D] = 1;
        }
    }

    return -1;
}

int main()
{
    ios_base::sync_with_stdio(false);
    cin.tie(nullptr);

    cin >> F >> S >> G >> U >> D;

    int ans = solve();
    if (ans == -1)
        cout << "use the stairs\n";
    else
        cout << ans << "\n";

    return 0;
}
  • 다른 사람 풀이

(S가 G보다 작으며 S + U가 F보다 작음) OR (S가 G보다 크고 S - D가 1보다 작으면) UP 버튼을 누른다. 이외에는 DOWN 버튼을 누른다.

가장 적은 방법으로 이동하는 방법임을 귀납적으로 추론해야하는데 잘 안된다.

사칙 연산 중 덧셈과 뺼셈의 순서는 결과에 영향이 없음을 알면 된다!! 히히!

그러니 저번 코테에 나온 문제처럼 현위치 부터 2배 이동 같은 경우는 큐를 이용하여 문제를 풀어야 한다. (곱셈의 결과는 순서에 영향을 받음)

#include <cstdio>

int main()
{
    int F, S, G, U, D, n;
    scanf("%d%d%d%d%d", &F, &S, &G, &U, &D);
    for (n = 0; n < 1000000; n++)
    {
        if (S == G)
        {
            printf("%d", n);
            return 0;
        }
        if (S + U > F && S - D < 1) break;
        if (S < G && S + U <= F || S > G && S - D < 1) S += U;
        else S -= D;
    }
    puts("use the stairs");
}

댓글남기기