본문 바로가기
SW/알고리즘 문제풀이

[Codility] Lesson5 - Prefix Sums: Passing Cars

by 미래미래로 2020. 12. 15.
728x90

Problem

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.

How to solve

문제 해석

- 정보

N의 길이를 가진 배열 A

배열 A의 요소는 도로위의 차를 나타냄

0: 차가 동쪽으로 가는 것

1: 차가 서쪽으로 가는 것 

차의 쌍은 (P, Q)로 나타내고, 0<=P<Q<N 

P: 동쪽으로 가는 차

Q: 서쪽으로 가는 차

 

- 구해야 하는것?

지나가는 차의 수

 

- 예시

A[0] = 0

A[1] = 1

A[2] = 0

A[3] = 1

A[4] = 1

이라면, 경우의 수는 (0,1) (0,3) (0,4) (2,3) (2,4)

 

- 풀이

동쪽으로 가는 차를 세고, 

서쪽으로 가는 차를 만날 때마다 그때까지 센 동쪽으로 가는 차를 더해준다. 

 

**주의 사항**

자료형 범위 주의!

passingCar가 1000000000을 넘는 경우가 생기므로, 

자료형을 long long로 해줘야 한다. 

 

Solution(c++)

#include <bits/stdc++.h>

using namespace std;

int solution(vector<int> &A) {
    // write your code in C++14 (g++ 6.2.0)
    long long passingCarCnt = 0;
    int eastCarCnt = 0;

    for(int i=0; i<A.size(); i++){
        if(A[i] == 0){
            eastCarCnt += 1;
        }else{
            passingCarCnt += eastCarCnt;
        }
    }

    if(passingCarCnt > 1000000000){
        passingCarCnt = -1;
    }
    return passingCarCnt;
}

Test Result

범위때문에 100%가 나오지 않아 다시풀었다 ㅠㅠ

 

728x90

댓글