https://www.acmicpc.net/problem/2828
문제의 접근 방법
- 문제에서 제시해준대로 바구니의 위치를 미리 지정하고 접근하기
- 왼쪽으로 이동하는 것과 오른쪽으로 이동하는 것을 나눠서 생각하기
- 사과가 떨어지는 경우 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)
'백준 write-up > 정렬 & 그리디' 카테고리의 다른 글
[백준] 피보나치 : 9009번 - Python (0) | 2021.08.11 |
---|---|
[백준] A와 B : 12904번 - Python (0) | 2021.08.11 |
[백준] 과제 : 13904번 - Python (0) | 2021.08.10 |
[백준] 폴리오미노 : 1343번 - Python (0) | 2021.08.10 |
[백준] 게임을 만든 동준이 : 2847번 - Python (0) | 2021.08.09 |