2828 사과담기

phoenixKim·2022년 8월 28일
0

백준 알고리즘

목록 보기
88/174

알고리즘 분류

: 구현?

다른코드

풀이전략

1) 일단을 그림을 그려보면서 문제를 이해를 하려고 노력함.

2) start와 end 정점을 만든 후, 1초마다
방향을 선정해서 함께 오른쪽, 왼쪽 하는
즉 증감을 하면서 입력된 벡터에 도달하는지 카운팅을 하면서 진행함.

코드


#include <algorithm>
#include <string>
#include <vector>
using namespace std;
#include <iostream>


// 20:41 ~ 21:11

int main() 
{
	//5칸으로 이루어져 있는데 
	// 1칸을 차지하는 바구니가 있음. 

	// 처음에 왼쪽 1칸을 차지함. 

	// 각 사과는 5칸 중 한칸의 상단에서 떨어지기 시작함. 
	// 한 사과가 바닥에 닿는 즉시, 다른 사과가 떨어짐.

	// go | | | | | |
	//     1      
	//             5
	//         3
	// 떨어지는 위치가 순서대로 주어짐.

	// go | | | | | |
	//     1
	//             5
	//         3
	// 왼쪽에서 2칸을 먼저 차지함.

	// start 랑 end 정점을 만들고, 한칸씩 이동할때마다 증감.
	// 타겟으로 잡은 정점이 start 와 end 안에 이상 이하일 경우에 이동거리 종료
	//[0] = true;
	//[1] = true;

	//v[0] = true;
	//v[4] = true;
	//v[2] = true;

	int n, m;
	cin >> n >> m;

	int j;
	cin >> j;

	vector<int>v(j);

	for (int i = 0; i < j; ++i)
	{
		cin >> v[i];
	}

	int start = 1;
	int end = start + m - 1;

	int res = 0;
	// v개의 갯수만큼 진행 해야 함.
	for (int i = 0; i < j; ++i)
	{
		while (1)
		{			
			// 접하니까 이동을 해야함. 
			// 오른쪽으로 이동할까? 
			// 왼쪽으로 이동할까? 
			// 를 정해야 함.
			if (start <= v[i] && v[i] <= end)
			{
				//cout << "whtae" << endl;
				break;
			}

			if (end < v[i])
			{
				//오른쪽으로 이동해야 함. 
				start += 1;
				end += 1;
				//cout << "right" << endl;
			}
			else if (start > v[i])
			{
				//왼쪽으로 이동해야 함.
				start -= 1;
				end -= 1;
				//cout << "left" << endl;
			}
			++res;
			//cout << start << endl;
			//cout << end << endl;
		}


	}

	cout << res;
 }

profile
🔥🔥🔥

0개의 댓글

관련 채용 정보