728x90
반응형
  • 문제

상근이는 오락실에서 바구니를 옮기는 오래된 게임을 한다. 스크린은 N칸으로 나누어져 있다. 스크린의 아래쪽에는 M칸을 차지하는 바구니가 있다. (M<N) 플레이어는 게임을 하는 중에 바구니를 왼쪽이나 오른쪽으로 이동할 수 있다. 하지만, 바구니는 스크린의 경계를 넘어가면 안 된다. 가장 처음에 바구니는 왼쪽 M칸을 차지하고 있다.

스크린의 위에서 사과 여러 개가 떨어진다. 각 사과는 N칸중 한 칸의 상단에서 떨어지기 시작하며, 스크린의 바닥에 닿을때까지 직선으로 떨어진다. 한 사과가 바닥에 닿는 즉시, 다른 사과가 떨어지기 시작한다.

바구니가 사과가 떨어지는 칸을 차지하고 있다면, 바구니는 그 사과가 바닥에 닿을 때, 사과를 담을 수 있다. 상근이는 사과를 모두 담으려고 한다. 이때, 바구니의 이동 거리의 최솟값을 구하는 프로그램을 작성하시오.

  • 입력

첫째 줄에 N과 M이 주어진다. (1 ≤ M < N ≤ 10) 둘째 줄에 떨어지는 사과의 개수 J가 주어진다. (1 ≤ J ≤ 20) 다음 J개 줄에는 사과가 떨어지는 위치가 순서대로 주어진다.

  • 출력

모든 사과를 담기 위해서 바구니가 이동해야 하는 거리의 최솟값을 출력한다.

  • 예제 입력
5 1
3
1
5
3
5 2
3
1
5
3
  • 예제 출력
6
4
  • 접근방식

예시를 정확히 이해해야함, 바구니는 왼쪽과 오른쪽이 있으며 그 사이에 사과를 받아야함

오른쪽 끝점은 왼쪽 + M - 1 이라는걸 알아야함

  • 코드
#include <iostream>
#include <algorithm>

using namespace std;

int n, m, j, _left, _right, temp, ret;

int main() 
{
	cin >> n >> m >> j;

	_left = 1;// 바구니의 왼쪽 부분은 1부터 시작

	for (int i = 0; i < j; i++)
	{
		cin >> temp; // 이동할 거리
		_right = _left + m - 1; // 오른쪽 부분은 왼쪽 + m - 1
		if (temp >= _left && temp <= _right) // 이미 바구니가 그 자리라면 이동하지않음
			continue;
		else
		{
			if (temp < _left) // 사과가 왼쪽에 떨어진 경우
			{
				ret += (_left - temp); // left - temp로 이동
				_left = temp; //left가 temp로 향함, right는 앞에서 다시 정의함
			}
			else // 사과가 오른쪽에 떨어진 경우
			{
				_left += (temp - _right); // left가 temp - right로 이동
				ret += (temp - _right); // temp - right로 이동, right는 앞에서 다시 정의함
			}
		}
	}
	cout << ret;

	return 0;
}
 

2828번: 사과 담기 게임

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

www.acmicpc.net

 

728x90
반응형

'C++ > BOJ' 카테고리의 다른 글

[C++]/백준 4659번 비밀번호 발음하기  (0) 2023.01.17
[C++]/백준 2910번 빈도 정렬  (0) 2023.01.13
[C++]/백준 1992번 쿼드 트리  (0) 2023.01.13
[C++]/백준 2583번 영역구하기  (0) 2023.01.13
[C++]/백준 2468번 안전 영역  (1) 2023.01.13

+ Recent posts