[Codility] Lesson 15 - CountTriangles

개발자·2021년 9월 4일

Task discription

An array A consisting of N integers is given. A triplet (P, Q, R) is triangular if it is possible to build a triangle with sides of lengths A[P], A[Q] and A[R]. In other words, triplet (P, Q, R) is triangular if 0 ≤ P < Q < R < N and:

  • A[P] + A[Q] > A[R],
  • A[Q] + A[R] > A[P],
  • A[R] + A[P] > A[Q].

For example, consider array A such that:

A[0] = 10    A[1] = 2    A[2] = 5
A[3] = 1     A[4] = 8    A[5] = 12

There are four triangular triplets that can be constructed from elements of this array, namely (0, 2, 4), (0, 2, 5), (0, 4, 5), and (2, 4, 5).

Write a function:

int solution(vector<int> &A);

that, given an array A consisting of N integers, returns the number of triangular triplets in this array.

For example, given array A such that:

A[0] = 10    A[1] = 2    A[2] = 5
A[3] = 1     A[4] = 8    A[5] = 12

the function should return 4, as explained above.

Write an efficient algorithm for the following assumptions:

  • N is an integer within the range [0..1,000];
  • each element of array A is an integer within the range [1..1,000,000,000].

Source code

#include <algorithm>

int solution(vector<int> &A) {
    int n = A.size();
    int ans = 0;
    sort(A.begin(), A.end());
    for(int i=0;i<n-2;i++) {
        int j = i+1;
        int k = j+1;
        while(j<n-1) {
            if(k<n && A[i]+A[j] > A[k]) {
                k++;
            }                                             
            else {
                ans += k-j-1;
                j++;
            }
        }
    }
    return ans;
}

Review

비슷한 방식으로 3중 for문 쓰니 성능 에러가 발생했다...
뭐가 다른지 잘 모르겠지만 이렇게 풀어야 100% 정답이 뜬다 ㅜ.ㅜ

profile
log.info("공부 기록 블로9")

0개의 댓글