취미/Programming Problems

[Codility] Passing Cars

Lero God 2023. 5. 3. 18:35

링크 : https://app.codility.com/programmers/lessons/5-prefix_sums/passing_cars/

내 풀이 :

맨 처음 시도에는 이중 for문을 돌면서 검사했더니 시간 초과가 났다.

두 번째 시도는 1 을 가진 인덱스를 다른 배열에 저장해두고 0을 가진 인덱스와 비교하여 1을 가진 인덱스가 더 크면 (다른 배열의 크기 - 1을 가진 인덱스) 의 값을 최종 값에 더했다. 하지만 비교하는 다른 배열의 크기가 커서 그런지 시간 초과가 났다.

세 번째 시도는 0 을 가진 인덱스 배열을 추가로 선언해 불필요한 연산을 줄였다.

그리고 0의 인덱스와 1의 인덱스를 비교했을 때 1의 인덱스가 더 작으면, 1을 가진 인덱스 배열에서 해당 값을 지움으로써 비교 연산을 줄였다.

시간 복잡도는 O(n + n/2)

int solution(vector<int>& arr)
{
	vector<int> numOneIndexes;
	vector<int> numZeroIndexes;

	for (int index = 0; index < arr.size(); ++index)
	{
		int num = arr[index];

		if (num == 1)
		{
			numOneIndexes.push_back(index);
		}
		else if (num == 0)
		{
			numZeroIndexes.push_back(index);
		}
	}

	int count = 0;
	const int bigNum = 1000000000;

	for (int index = 0; index < numZeroIndexes.size(); ++index)
	{
		int numZeroIndex = numZeroIndexes[index];
		auto iter = numOneIndexes.begin();

		for (; iter < numOneIndexes.end();)
		{
			int numberOneIndex = *iter;

			if (numberOneIndex > numZeroIndex)
			{
				count += numOneIndexes.size();
				break;
			}
			else
			{
				iter = numOneIndexes.erase(iter);
			}
		}

		if (count > bigNum)
		{
			return -1;
		}
	}

	return count;
}

더 좋은 풀이 방식:

0이 한 번 등장하면 다음 0이 등장 할 때까지 1씩 더해주고, 0이 한 번 등장하면 다음 0이 나올 때까지 2씩, 그 다음 0이 나올 때까지 3씩, 그 다음 4씩, 이렇게 지금까지 등장한 0의 갯수를 계산해서 한 번에 계산 할 수 있도록 짜면 된다 😮

시간 복잡도는 O(n)

'취미 > Programming Problems' 카테고리의 다른 글

[Codility] Max Slice Sum  (0) 2023.05.06
[Codility] Equi Leader  (0) 2023.05.06
[Codility] PermMissingElem  (0) 2023.05.02
[Codility] OddOccurrencesInArray  (0) 2023.05.02
[백준] 2677번 - 단지 번호 붙이기  (0) 2020.07.20