본문 바로가기

백준 write-up/정렬 & 그리디

[백준] 사과 담기 게임 : 2828번 - Python

728x90
반응형

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

 

2828번: 사과 담기 게임

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

www.acmicpc.net

 

 

 

문제의 접근 방법

 

- 문제에서 제시해준대로 바구니의 위치를 미리 지정하고 접근하기

- 왼쪽으로 이동하는 것과 오른쪽으로 이동하는 것을 나눠서 생각하기

- 사과가 떨어지는 경우 3가지 생각해보기

 (1) 사과가 바구니 안에 똑 떨어지는 경우

 (2) 사과가 바구니 왼쪽 방향으로 떨어지는 경우

 (3) 사과가 바구니 오른쪽 방향으로 떨어지는 경우

 

 

 

내가 막혔던 부분

 

- 바구니의 위치를 지정하는 것에서 오른쪽 위치를 어떻게 지정해야할 지 모름.

- 바구니가 양쪽으로 왔다갔다 하는 것을 떨어지는 위치에서 왼쪽 위치나 오른쪽 위치를 빼야한다는 것 까지는 생각했는데 3가지 경우의 수로 나눠서 구현해 볼 생각을 하지 못 함.

- right = m 이라고 설정하면 되는 것에 대해 오랫동안 고민함.

 

 

 

문제 풀이 방법

 

(1) 스크린 n칸과 바구니가 차지하는 칸 m을 입력받기

 

(2) 떨어지는 사과의 개수 j 입력받기

 

(3) 가장 처음에 바구니는 왼쪽 M칸을 차지한다고 했으므로 left 값은 1로 지정, right 값은 m으로 지정하기

 

(4) 나중에 바구니의 이동거리를 합산한 값을 넣어줄 변수 count를 초기화하여 선언하기

 

(5) 사과의 개수 j만큼 반복문을 돌려 사과가 떨어지는 위치를 position에 입력받기

 

(6) 사과가 떨어지는 경우의 수 3가지를 나눠서 구현하기

 

   - 사과가 바구니 안에 떨어진다면: continue

 

   - 사과가 왼쪽에 가깝게 떨어진다면:

왼쪽 좌표 값 left에서 떨어지는 위치 position 빼준 값을 count에 누적해서 더하기(그만큼 움직인 것이니까!)

왼쪽으로 움직인 만큼(위에서 계산한 값) 오른쪽 좌표에서 빼주기

왼쪽 좌표는 현재 사과가 떨어진 위치인 position값으로 바꿔주기

 

   - 사과가 오른쪽에 가깝게 떨어진다면:

떨어지는 위치 position에서 오른쪽 좌표 값 right를 빼준 값을(position 값이 더 크기 때문에 여기서 빼주는 것) count에 누적해서 더하기

오른쪽으로 움직인 만큼(위에서 계산한 값) 왼쪽 좌표에다가 더해주기

오른쪽 좌표는 현재 사과가 떨어진 위치인 position값으로 바꿔주기

 

(7) 움직인 횟수가 누적되어서 저장돼있는 count값 출력하기!

 

 

 

소스코드

n,m = map(int, input().split())
j = int(input())

left = 1
right = m
count = 0

for _ in range(j):
    position = int(input())

    if left <= position and right >= position:
        continue
    elif left > position:
        count += (left-position)
        right -= (left-position)
        left = position
    else:
        count += (position-right)
        left += (position-right)
        right = position

print(count)
728x90
반응형