본문 바로가기

Algorithm/Baekjoon BOJ

[백준][파이썬] 2828번 : 사과 담기 게임(코드, 해설, 풀이)

반응형

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

 

2828번: 사과 담기 게임

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

www.acmicpc.net

 

 

 


- 문제

  칸수 N과 바구니의 크기 M이 주어지고 둘째줄에 떨어지는 사과의 개수 J, 이후부터는 사과가 떨어지는 위치가 주어지면 가장 최소한으로 움직이면서 모든 사과를 담을 수 있는 방법을 택할 시에 움직이는 거리를 출력하는 문제이다. 예를 들어 바구니의 크기 M이 4이고 칸수 N이 5이면 사과가 1 이후에 5의 위치에 떨어지지 않는 한 움직일 필요가 없으므로, 만약에 1, 2, 3, 4의 순서로 4번 떨어지게 되면 출력값으로 0이 나올 것이다. 


- 해설

  바구니는 언제나 1의 위치에서 시작한다고 생각하고 만약 바구니의 길이가 2이고 총 칸수가 5이면 바구니의 길이가 2이기 때문에 사과가 5의 위치에 떨어지더라도 4의 위치에 가서 받는다고 가정해서 문제를 접근해야 할 것 같다. 이러한 경우 3가지 상황으로 나누어서 생각해 볼 수 있을 것 같다. 

 

1. 현재 상근이가 서 있는 위치가 사과가 떨어지는 위치에 있거나 왼쪽(작을)에 있으면서 (현재 위치 + 바구니의 크기)를 한게 사과의 위치보다 크거나 같을 경우

  : 해당 위치에 가만히 있어도 바구니 안으로 사과가 들어가므로 pass

상황 1.

2. 상근이가 서 있는 위치가 사과가 떨어지는 위치보다 오른쪽(큰)에 있는 경우

  : 바구니를 들고 사과가 떨어지는 위치까지 이동해야 함 (상근이가 좌측으로 이동해야 함)

상황 2.

3. 나머지 모든 경우

  : 바구니를 들고 사과가 떨어지는 위치까지 이동해야 함 (상근이가 우측으로 이동해야 함)

상황 3.


- 풀이

import sys
N, M = map(int, sys.stdin.readline().split())
J = int(sys.stdin.readline())
now = 1
apples = []
answer = 0
for _ in range(J):
    apples.append(int(sys.stdin.readline()))
for apple in apples:
    if now <= apple and now + (M-1) >= apple:
        pass
    elif now > apple:
        answer += abs(apple - now)
        now = apple
    else:
        answer += apple - (M-1) - now
        now = apple - (M-1)
print(answer)

  상황 1,2,3을 if, elif, else로 구분했다. M-1을 한 이유는 바구니의 크기가 2라고 하면 현재 위치(1이라고 가정)에서 2를 더하면 3이 되므로 내가 원하는 건 1과 2만을 포함하는 것이기 때문에 -1을 했다. 

  apples에 모든 값을 다 저장하고, for문을 통해 각 apple을 이용해서 사과가 떨어지는 위치랑 현재 위치(now)를 비교하도록 하였다. answer에 값을 더해줄때는 언제나 현재 위치(now)를 고려해서 더해주도록 하였다.

반응형