본문 바로가기

공부하는 것들/알고리즘

백준 2828 : 사과 담기 게임(그리디) **

www.acmicpc.net/problem/2828

 

2828번: 사과 담기 게임

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

www.acmicpc.net

스크린 N칸, M칸을 차지하는 바구니

바구니 이동 가능 but 경계를 넘어가면 안된다.

초기 상태 : 제일 왼쪽 M칸 차지

 

한 사과가 바닥에 닿는 즉시, 다른 사과가 떨어지기 시작한다.

바구니의 이동 거리의 최솟값을 구하시오.

 

 

def solve(N,M,apples):
    L,R = 0, M-1
    ans = 0
    for point in apples:
        # 떨어지는 지점이 오른쪽인지, 왼쪽인지 구분
        if point > R : 
            dist = (point-R)
            L,R = L+dist, R+dist 
        elif point < L : 
            dist = (L-point)
            L,R = L-dist, R-dist
        else: continue
        ans+=dist
    return ans
   

if __name__=='__main__':
    N,M = map(int,input().split())
    num = int(input())
    apples = []
    for _ in range(num):
        apples.append(int(input())-1)
        ### 좌표를 0부터 N-1까지로 설정할 것이기 때문에, 
        ### 사과가 떨어지는 좌표도 0부터 N-1까지로 보정해야 함.
    ans = solve(N,M,apples)
    print(ans)

 

 # 사과가 떨어지는 지점은 0에서 N-1을 벗어나지 않으므로
# 업데이트 되는 L,R의 범위 또한 고려해주지 않아도 됨.