개발자 톡

연습문제 톡 [HSAT 3회 정기 코딩 인증평가 기출] 교차로

[HSAT 3회 정기 코딩 인증평가 기출] 교차로 , 시간복잡도 질문

등록일
2023-05-14 19:43:54
조회수
624
작성자
dltmdwo0508

#include
#include
#include
#include
using namespace std;

vectorv;
int cnt;
bool now[5];

int main()
{

	ios_base::sync_with_stdio(false);
	cin.tie(NULL), cout.tie(NULL);

	int N;

	queue>a;
	queue>b;
	queue>c;
	queue>d;


	scanf("%d", &N);

	vectorans(N);
	ans.assign(N , -1);


	int curr_time;
	int min_time;

	for (int i = 0; i < N; i++) {
		int t;
		char w;
		scanf("%d %c", &t, &w);

		// 순서 , 시간 
		if (w == 'A') {
			a.push({ i,t });
		}
		else if (w == 'B') {
			b.push({ i,t });
		}
		else if (w == 'C') {
			c.push({ i,t });
		}
		else
			d.push({ i,t });

		if (i == 0)
			min_time = t;

	}

	curr_time = min_time;

	while (a.size() || b.size() || c.size() || d.size()) {

		int a_time, b_time, c_time, d_time;


		if (a.size()) {
			a_time = a.front().second;
			min_time = min(min_time, a_time);
			if (curr_time >= a_time)
				now[0] = 1;
		}
		if (b.size()) {
			b_time = b.front().second;
			min_time = min(min_time, b_time);

			if (curr_time >= b_time)
				now[1] = 1;
		}
		if (c.size()) {
			c_time = c.front().second;
			min_time = min(min_time, c_time);

			if (curr_time >= c_time)
				now[2] = 1;
		}
		if (d.size()) {
			d_time = d.front().second;
			min_time = min(min_time, d_time);
			if (curr_time >= d_time)
				now[3] = 1;
		}


		if (min_time > curr_time)
			curr_time = min_time;


		int idx;

		bool a1, b1, c1, d1;

		a1 = b1 = c1 = d1 = false;

		if (now[0] == 1 && now[1] == 1 && now[2] == 1 && now[3] == 1)
			break;

		if (now[0] == 1 && now[3] == 0) {
			idx = a.front().first;
			a.pop();
			ans[idx] = curr_time;
			a1 = true;
		}

		if (now[1] == 1 && now[0] == 0) {
			idx = b.front().first;
			b.pop();
			ans[idx] = curr_time;
			b1 = true;

		}

		if (now[2] == 1 && now[1] == 0) {
			idx = c.front().first;
			c.pop();
			ans[idx] = curr_time;
			c1 = true;
		}

		if (now[3] == 1 && now[2] == 0) {
			idx = d.front().first;
			d.pop();
			ans[idx] = curr_time;
			d1 = true;
		}

		if (a1 == true) {
			now[0] = 0;
		}
		if (b1 == true)
			now[1] = 0;
		if (c1 == true)
			now[2] = 0;
		if (d1 == true)
			now[3] = 0;

		curr_time++;
	}

	for (auto a : ans)
		printf("%d\n", a);


	return 0;
}


다음과 같이 풀이했는데 시간초과가 나옵니다.

이런 저런 방향으로 계속해서 줄여보려 했지만 여전히 시간초과가 나오네요

시간을 줄일수 있는 좋은 방법이 있을까요?? 

#[hsat_3회_정기_코딩_인증평가_기출]_교차로
#c++

이 카테고리의 톡 더보기