백준/Inha Algorithm Study Group

DAY3 초급 - 백준 2828번 (C++)

FDEE 2020. 9. 4. 17:29

www.acmicpc.net/problem/2828

 

2828번: 사과 담기 게임

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

www.acmicpc.net

 

<답안>

#include <iostream>
using namespace std;
int main()
{
    int M,N,count,location;
    int result = 0;
    int left,right,temp;
    cin>>N>>M>>count;
    left = 0;
    right = M;
    while(count--)
    {
        cin>>location;
        if(location > right)
        {
            temp = location - right;
            result += temp;
            right += temp;
            left += temp;
        }
        else if(location <= left)
        {
            temp = left - location + 1;
            result += temp;
            left -= temp;
            right -= temp;
        }
    }
    cout<<result;
    return 0;
}

 

<설명>

개념자체는 어렵지 않지만 왼쪽, 오른쪽, 이동하는 위치를 잘 고려해서 풀어야 문제없이 계산된다

 

M으로 입력된 길이를 토대로 왼쪽끝 left를 0, 오른쪽끝 right를 M으로 설정한 다음

입력된 사과의 위치 location 값에 따라 계산이 된다

 

만약 location이 right보다 큰 경우

-> location - right 만큼 이동해야 함으로 이를 temp로 저장한 다음에

    누적이동 result += temp, 오른쪽 right += temp, 왼쪽 left += temp 해주면 된다

 

왼쪽의 경우가 살짝 헷갈리는데 만약 바구니가 1~2 사이에 위치하고 location이 1이 입력된다 치면 이동을 해야한다

이때 잘 생각해보면 left와 location이 같아도 이동해야 함을 알 수 있다

또한, 이동거리는 location-left 값에서 1을 더해야 함을 알 수 있다 그렇기에

 

만약 location이 left보다 작거나 같은경우

-> location - left + 1 만큼 이동해야 함으로 이를 temp로 저장한 다음에

     누적이동 result += temp, 오른쪽 right -= temp, 왼쪽 left -= temp 해주면 된다

 

최종 누적된 result를 출력하면 된다