CS/코딜리티

문제 // Codility // Prefix Sum // PassingCars

문스코딩 2018. 8. 19. 00:50
업데이트 :: 2018.08.19



문제

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.

Assume that:

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.
Complexity:

expected worst-case time complexity is O(N);
expected worst-case space complexity is O(1) (not counting the storage required for input arguments).

코드

1차 풀이

class Solution {
    public int solution(int[] A) {

        // 나올수 있는 인덱스 짝짓기 경우의 수 구하기
        // 0 <= P < Q < N를 만족하는 경우의 수 구하기
        // [0, 1, 0, 1, 1] => (0,1) (0,3) (0,4) (2,3) (2,4) 가능한 경우의 수 5가지
        // * 조건 :: 페어가 1,000,000,000 초과라면 -1 리턴

        // == Exception ==
        if(A.length==0) return 0;

        int pairs = 0;
        for(int i=0; i<A.length; i++) {
            // == P 기준으로 모든 케이스를 만듬 ==    
            if(A[i]==0) {
                for(int j=i+1; j<A.length; j++) {   
                    // == Q라면 ==
                    if(A[j]==1) {
                        pairs++;
                        if(pairs > 1000000000) {
                            return -1;
                        }
                    }
                }
            }   
        }

        return pairs;
    }
}

2차 풀이

class Solution {
    public int solution(int[] A) {

        // 나올수 있는 인덱스 짝짓기 경우의 수 구하기
        // 0 <= P < Q < N를 만족하는 경우의 수 구하기
        // [0, 1, 0, 1, 1] => (0,1) (0,3) (0,4) (2,3) (2,4) 가능한 경우의 수 5가지
        // * 조건 :: 페어가 1,000,000,000 초과라면 -1 리턴

        // == Exception ==
        if(A.length==0) return 0;

        // 각각의 전체갯수를 알고 있으면 이중반복문을 사용하지 않아도 해결가능
        int sumQ = 0;
        int pairs = 0;

        // == 각각의 전체개수 파악 ==
        for(int a : A)
            if(a == 1) sumQ++;

        for(int i=0; i<A.length; i++) {
            // == P 기준으로 모든 케이스를 만듬 ==    
            if(A[i]==0) {
                pairs += sumQ;
                if(pairs > 1000000000) return -1;
            } else {
                sumQ--;
            }   
        }

        return pairs;
    }
}

결과

1차 50%

  • 성능
    • O(N ** 2)

2차 100%


Created by MoonsCoding

e-mail :: jm921106@gmail.com

반응형