
5-1. PassingCars
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:
class Solution { public int solution(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.
비어 있지 않은 N개의 정수로 구성된 배열 A가 주어집니다. 배열 A의 연속된 요소는 도로 위의 연속된 자동차를 나타냅니다.
배열 A는 0과 1만 포함합니다:
0은 동쪽으로 이동하는 자동차를 나타냅니다.
1은 서쪽으로 이동하는 자동차를 나타냅니다.
목표는 지나가는 자동차를 세는 것입니다. 우리는 P가 동쪽으로 이동하고 Q가 서쪽으로 이동할 때, 0 ≤ P < Q < N인 자동차 쌍 (P, Q)이 지나가는 자동차라고 합니다.
예를 들어, 배열 A가 다음과 같다고 가정합니다:
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) <- 빗겨가는 자동차의 수라고 생각하면됩니다.
비어 있지 않은 N개의 정수로 구성된 배열 A가 주어지면, 지나가는 자동차 쌍의 수를 반환합니다.
지나가는 자동차 쌍의 수가 1,000,000,000을 초과하면 함수는 -1을 반환해야 합니다.
예를 들어, 주어진 배열이 다음과 같다면:
A[0] = 0 A[1] = 1 A[2] = 0 A[3] = 1 A[4] = 1
함수는 위에서 설명한 대로 5를 반환해야 합니다.
문제풀이
import java.util.*;
class Solution {
public int solution(int[] A) {
int length = A.length;
int sum = 0;
for(int value : A){
sum += value;
}
int carCheck = 0;
for(int i = 0; i < length; i++){
if(A[i] == 0){
carCheck += sum;
if (carCheck > 1000000000) {
return -1;
}
}else{
sum--;
}
}
return carCheck;
}
}
0과 1만 값으로 주어지기 때문에 배열의 전체값을 다 더한 값이 총 서쪽으로 이동하는 자동차의 수 입니다.
for문을 통해 배열의 0번째부터 마지막까지 값이 0이라면 carCheck에 전체 sum을 더해 마주치는 자동차의 수를 더해주고 값이 1이라면 sum에 -1을 해줘 다음 인덱스의 차례에 마주칠 수 있는 경우의 수를 수정해 줍니다. 이렇게 전체가 반복되면 carCheck에는 마주친 자동차의 수가 최종적으로 업데이트되어 해당 값을 리턴해줍니다. 추가적으로 carCheck를 더해주는 과정 뒤에 1,000,000,000을 초과하면 함수는 -1을 반환하는 if문을 추가해 문제에서 요구한 초과값에 대한 리턴을 만족시켜줍니다.
제출결과

문제풀어보기 -> https://app.codility.com/programmers/lessons/5-prefix_sums/passing_cars/