Algorithm/Greedy Algorithm

[ BOJ 2828 ] S5 사과 담기 게임 { C++ }

surimi🍥 2022. 6. 25. 12:55
반응형

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

 

2828번: 사과 담기 게임

상근이는 오락실에서 바구니를 옮기는 오래된 게임을 한다. 스크린은 N칸으로 나누어져 있다. 스크린의 아래쪽에는 M칸을 차지하는 바구니가 있다. (M<N) 플레이어는 게임을 하는 중에 바구니를

www.acmicpc.net

C++

#include <iostream>
#include <algorithm>

using namespace std;

int main(void)
{
    ios::sync_with_stdio(0);
    cin.tie(0);

    int M, N, J, L = 1, R, A, D = 0, move;
    cin >> M >> N >> J;

    // M = 전체 칸, N = 바구니 크기 (1 ≤ M < N ≤ 10)
    // J = 사과 개수 (1 ≤ J ≤ 20)
    // L = 바스켓 왼쪽 끝 위치
    // R = 바스켓 오른쪽 끝 위치
    // A = 사과 떨어지는 위치
    // D = 이동거리 (result)

    for (int i = 0; i < J; i++)
    {
                // 바스켓 오른쪽 끝 위치 지정.
        R = L + N - 1;
        cin >> A;

                // 바구니 범위 안이면 스킵.
        if (A >= L && A <= R) continue;

                // 바구니 양 끝 중에서 사과와 가까운 쪽으로 이동거리 구하기.
        move = min(abs(A - R), abs(A - L)); 
        D += move;

                // 바스켓 이동 후 위치 재지정.
        L = L > A ? L - move : L + move;
    }
    cout << D;
}
반응형