2979 트럭 주차_240107 재풀이 바람.

phoenixKim·2022년 5월 16일
0

백준 알고리즘

목록 보기
24/174

언제품?

  • 220915 1:27 ~ 1:38

  • 카운팅 배열로 풀었음.

주의할 점 240107

: 들어오는 시점부터 진행하면 안되고, 다음 시간까지의 거리차인 1분 텀이 있어야 하는
방식으로 접근해야 하기 때문에 아래의 v[i].first + 1 방식으로 넣어야 함...

for (int i = 0; i < 3; ++i)
{
// 도착시간부터 출발시간까지 사이의 값도 카운팅을 해야함.
// 주의할점 : 들어온 시간부터 하면 안됨.
// 도착해서 나갈때 까지의 텀을 계산하는 것이므로.
for (int j = v[i].first + 1; j <= v[i].second; ++j)
{
++cnt[j];
}
}

최근 풀이

#include <iostream>
using namespace std;

#include <vector>
#include <algorithm>
#include <string>

int main()
{
	int a, b, c;
	cin >> a >> b >> c;

	vector<pair<int, int>>v(3);

	int mmax = 0;
	for (int i = 0; i < 3; ++i)
	{
		cin >> v[i].first >> v[i].second;

		if (mmax < v[i].second)
			mmax = v[i].second;
	}

	vector<int>cnt(mmax + 1, 0);
	
	// 한대를 주차하면 1분당 1대에 a원 
	// 두대를 주차하면 1분당 1대에 b원 
	// 세대를 주차하면 1분당 1대에 c원을 내야 함.

	// 5 3 1
	

	//  1 2 3 4 5 6 7 8 9 10 11 12 13
//	a	o		  o	
//	b		o	o
//	c	  o			  o
	// 어떻게 동일한 시간대에 차가 1,2,3대가 되는지
	// 시점을 알아야 함. 
	// => 카운팅 배열을 사용하자. 

	for (int i = 0; i < 3; ++i)
	{
		// 도착시간부터 출발시간까지 사이의 값도 카운팅을 해야함.
		// 주의할점 : 들어온 시간부터 하면 안됨.
		// 도착해서 나갈때 까지의 텀을 계산하는 것이므로.
		for (int j = v[i].first + 1; j <= v[i].second; ++j)
		{
			++cnt[j];
		}
	}

	// output
	//for (int i = 0; i <= mmax; ++i)
	//{
	//	cout << cnt[i] << " ";
	//}

	int res = 0;
	for (int i = 0; i <= mmax; ++i)
	{
		if (cnt[i] == 1)
		{
			res += a * cnt[i];
		}
		else if (cnt[i] == 2)
		{
			res += b * cnt[i];
		}
		else if (cnt[i] == 3)
		{
			res += c * cnt[i];
		}
	}
	cout << res;
}

접근

코드로 어떻게 표현할 것인가???

도착한 시간과 떠난 시간
1번 트럭 : 1초에 도착 ~ 6초에 떠남...
2번 트런 : 3초에 도착 ~ 5초에 떠남...
3번 트럭 : 2초에 도착 ~ 8초에 떠남...
=> 카운팅을 해서 접근하면 좋을 듯함..

대충 설계를 하면...
arr[101] 으로 놓고.
arr[1] ~ arr[6 - 1] 카운팅
arr[3] ~ arr[5 - 1] 카운팅
arr[2] ~ arr[8 - 1] 카운팅
// 도착 시간 - 1로 진행해야 아다리가 맞음.

// 1대 : 5초 , 2대 : 3초 , 3대 : 1초

//arr[x] : x초부터 x + 1초까지 대기함.
arr[1] : 1 / 1대 있음. -> 1 5 = 5 // sum : 5
arr[2] : 2 / 2대 있음. -> 2
3 = 6 // sum : 11
arr[3] : 3 / 3대 있음. -> 3 1 = 3 // sum : 14
arr[4] : 3 / 3대 있음. -> 3
1 = 3 // sum :17
arr[5] : 2 / 2대 있음. -> 2 3 = 6 // sum :23
arr[6] : 1 / 1대 있음. -> 1
5 = 5 // sum :28
arr[7] : 1 / 1대 있음. -> 1 * 5 = 5 // sum :33??
arr[8] : 8초 이후로는 없음 -> 0

코드


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

int main()
{
	//1대만 주차하면 : 5원
	//2대 주차하면 : 3원씩
	//3대 주차하면 1원씩 

	// 1 ~ 6
	// 3 ~ 5
	// 2 ~ 8

	// 1 에서 2 초까지는 한대 -> 5
	// 2에서 3초 까지는 두대 -> 6
	// 3에서 4초 까지는 3대 -> 3
	// 4에서 5초까지는 3대 -> 3
	// 5초에서 6초까지는 2대 -> 6
	// 6초에서 7초까지는 1대 -> 5
	// 7초에서 8초까지는 1대 -> 5

	// 1번. for 를 돌리면서 인덱스 카운팅을 시킴
	// 2번. 총합을 구하자.

	int a, b, c;
	cin >> a >> b >> c;

	vector<pair<int, int>>v(3);

	for (int i = 0; i < 3; ++i)
	{
		cin >> v[i].first;
		cin >> v[i].second;
	}
	
	vector<int>cost(100, 0);

	for (int i = 0; i < 3; i++)
	{
		for (int j = v[i].first; j < v[i].second; ++j)
		{
			++cost[j];
		}
	}

	int sum = 0;
	// 총합 구하기 
	for (auto iter : cost)
	{
		if (iter == 3)
		{
			sum += iter * c;
		}
		else if (iter == 2)
		{
			sum += iter * b;
		}
		else if (iter == 1)
		{
			sum += iter * a;
		}
	}
	cout << sum;


	//test용 출력하기
	//for (auto iter : cost)
	//{
	//	cout << iter << " ";
	//}

}


profile
🔥🔥🔥

0개의 댓글

관련 채용 정보