반응형
1. 문제
A non-empty array A consisting of N integers is given. The consecutive elements of array A represent consecutive cars on a road.
Array A contains only 0s and/or 1s:
- 0 represents a car traveling east,
- 1 represents a car traveling west.
The goal is to count passing cars. We say that a pair of cars (P, Q), where 0 ≤ P < Q < N, is passing when P is traveling to the east and Q is traveling to the west.
For example, consider array A such that:
A[0] = 0
A[1] = 1
A[2] = 0
A[3] = 1
A[4] = 1
We have five pairs of passing cars: (0, 1), (0, 3), (0, 4), (2, 3), (2, 4).
Write a function:
int solution(vector<int> &A);
that, given a non-empty array A of N integers, returns the number of pairs of passing cars.
The function should return −1 if the number of pairs of passing cars exceeds 1,000,000,000.
For example, given:
A[0] = 0
A[1] = 1
A[2] = 0
A[3] = 1
A[4] = 1
the function should return 5, as explained above.
Write an efficient algorithm for the following assumptions:
- N is an integer within the range [1..100,000];
- each element of array A is an integer that can have one of the following values: 0, 1.
서로 마주치는 차량의 수를 세는 문제. (동쪽으로 여행하는 차는 0 / 서쪽으로 여행하는 차 1)
예) return 5
| vector A | 마주치는 차량 |
| A[0] = 0 | A[1], A[3], A[4] |
| A[1] = 1 | |
| A[2] = 0 | A[3], A[4] |
| A[3] = 1 | |
| A[4] = 1 |
2. 매개변수 조건
- vector A 크기 : 1 ~ 100,000
- vector A 요소 값 : 0 or 1
3. 풀이 전략
- 동쪽으로 여행하는 차와 서쪽으로 여행하는 차를 각각 분리해서 저장한다. (0과 1을 분리)
- 서쪽으로 여행하는 차(1)를 내림차순으로 정렬한다.
- 그 후, 마주칠 수 있는 차량을 센다.
4. 주의사항
- 마주치는 차량이 1,000,000,000을 초과하면 -1을 return해야 한다.
5. 코드 (C++)
#include <algorithm>
int solution(vector<int> &A) {
// 0 과 1 분리
vector<int> east = {}; //0
vector<int> west = {}; //1
for(size_t i = 0; i < A.size(); i++)
{
//A의 index 저장
if(A[i] == 0) east.emplace_back(i);
else west.emplace_back(i);
}
// index 내림차순 정렬
sort(west.begin(), west.end(), greater<int>());
//마주치는 차량 세기, east[i] < west[i]
int cnt = 0;
for(size_t i = 0; i < east.size(); i++)
{
for(size_t j = 0; j < west.size(); j++)
{
if(east[i] > west[j]) break; //west는 내림차순 정렬이 되어있으므로, break
cnt++;
if(cnt > 1000000000) return -1;
}
}
return cnt;
}
6. 결과

반응형
'Algorithm Problem > Codility' 카테고리의 다른 글
| Lesson 5. Perfix Sums - PassingCars #3 (속도 개선-2) (0) | 2024.10.13 |
|---|---|
| Lesson 5. Perfix Sums - PassingCars #2 (속도 개선-1) (0) | 2024.10.13 |
| Lesson 4. Counting Elements - MissingInteger (0) | 2024.10.11 |
| Lesson 4. Counting Elements - MaxCounters #2 (속도 개선) (0) | 2024.10.09 |
| Lesson 4. Counting Elements - MaxCounters #1 (0) | 2024.10.09 |