PS

백준 2828. 사과 담기 게임

tose33 2021. 8. 15. 12:03

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

 

2828번: 사과 담기 게임

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

www.acmicpc.net

 

현재 바구니의 위치를 사과가 떨어지는 순서대로의 위치로 옮기면된다.

이때 최소의 횟수로 이동해야하므로 

사과의 위치가 현재 바구니의 오른쪽 끝지점보다 오른쪽에 있으면, 오른쪽 끝 지점이 사과의 위치에 오도록 이동.

사과의 위치가 현재 바구니의 왼쪽 끝지점보다 왼쪽에 있으면, 왼쪽 끝 지점이 사과의 위치에 오도록 이동. 

 

#include <iostream>
using namespace std;

int n,m,j;
int loc[30];

int main()
{
    cin >> n >> m >> j;
    for(int i = 1; i <= j; i++)
        cin >> loc[i];

    int left = 1;
    int right = m;
    int cnt = 0;
    for(int i = 1; i <= j; i++)
    {
        // 바구니가 사과를 얻을수 있는 위치에 없다
        if(!(loc[i] >= left && loc[i] <= right))
        {
            // 바구니가 사과가 떨어지는 위치의 왼쪽에 있다
            if(right < loc[i])
            {
                int move = loc[i] - right;
                cnt += move;
                left += move;
                right += move;
            }
            // 바구니가 사과가 떨어지는 위치의 오른쪽에 있다
            else if(loc[i] < left)
            {
                int move = left - loc[i];
                cnt += move;
                left -= move;
                right -= move;
            }
        }

    }
    cout << cnt;

}