[Codility]Lesson11/SieveOfEratosthenes/CountNonDivisible

Mijeong Ryu·2023년 5월 27일
0

Codility

목록 보기
2/17

https://app.codility.com/demo/results/training9GEGBK-XZE/

문제

You are given an array A consisting of N integers.

For each number A[i] such that 0 ≤ i < N, we want to count the number of elements of the array that are not the divisors of A[i]. We say that these elements are non-divisors.

For example, consider integer N = 5 and array A such that:

A[0] = 3
A[1] = 1
A[2] = 2
A[3] = 3
A[4] = 6

For the following elements:

A[0] = 3, the non-divisors are: 2, 6,
A[1] = 1, the non-divisors are: 3, 2, 3, 6,
A[2] = 2, the non-divisors are: 3, 3, 6,
A[3] = 3, the non-divisors are: 2, 6,
A[4] = 6, there aren't any non-divisors.
Write a function:

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

that, given an array A consisting of N integers, returns a sequence of integers representing the amount of non-divisors.

Result array should be returned as an array of integers.

For example, given:

A[0] = 3
A[1] = 1
A[2] = 2
A[3] = 3
A[4] = 6

the function should return [2, 4, 3, 2, 0], as explained above.

Write an efficient algorithm for the following assumptions:

N is an integer within the range [1..50,000];
each element of array A is an integer within the range [1..2 * N].
Copyright 2009–2023 by Codility Limited. All Rights Reserved. Unauthorized copying, publication or disclosure prohibited.

코드1

// you can also use imports, for example:
// import java.util.*;

// you can write to stdout for debugging purposes, e.g.
// System.out.println("this is a debug message");
import java.util.*;
class Solution {
    public int[] solution(int[] A) {
        int[] arr = new int[A.length];
        ArrayList<Integer> list = new ArrayList<>();
        for(int i=0; i<A.length; i++){
            int cnt =0;
            list = new ArrayList<>();
            for(int j=1; j*j<=A[i]; j++){
                if(j*j==A[i]) {
                    list.add(j);
                }
                else if(A[i]%j==0){
                    list.add(j); 
                    list.add(A[i]/j);
                }   
            }
            for(int z=0; z<A.length; z++){
                if(!list.contains(A[z])){
                    cnt++;
                }
            }
            arr[i] = cnt;

        }
        return arr;
        }
        // Implement your solution here
    }

풀이

코드1의 경우, 정확도는 100점이 나오지만 효율성이 0점이다. ㅠㅠ
코드1은 A의 배열 요소 하나씩 반복문을 돌면서 약수를 구해서 LIST에 담고,
다시 반복문을 돌면서 해당 값이 LIST에 Contain 되어있는지 여부를 확인하여 count하는 방식이다.

0개의 댓글