코딩테스트/Baekjoon

int 배열 arr에서 합이 100인 서로 다른 위치의 두 원소가 존재하는지 구하기

주니어주니 2023. 4. 9. 00:01

 

 

Q. 주어진 길이 N의 int 배열 arr에서 합이 100인 서로 다른 위치의 두 원소가 존재하면 1, 존재하지 않으면 0 반환하는 함수 func2(int arr[], int N) 작성 (arr의 각 수는 0 이상 100 이하, N은 1000 이하)

 

 

func2({1, 52, 48}, 3) = 1;

func2({50, 42}, 2) = 0;

func2({4, 13, 63, 87}, 4) = 1;

 

 

public static void main(String[] args) {

    int[] arr = {4, 13, 63, 87};
    int N = 4;

    System.out.println("answer: " + func2(arr, N));
}

private static int func2(int[] arr, int n) {

    // arr에서 0부터 길이-1까지 두개씩 뽑아서 합이 100인지 확인
    for(int i=0; i<n; i++) {
        for(int j=i + 1; j<n; j++) {
            if(arr[i] + arr[j] == 100) return 1;
        }
    }
    return 0;
}

출력

answer: 1

 

 

=> 시간 복잡도 O(N²) 

 

 

 

 

다른 방법) 

 

public static void main(String[] args) {

    int[] arr = {4, 13, 63, 87};
    int N = 4;

    System.out.println("answer: " + func2(arr, N));
}

private static int func2(int[] arr, int n) {

    // 값을 하나 선택해서 이전에 그 값과 합쳐 100이 나오는 수가 등장했으면 1, 등장한 적 없으면 0 
    int[] count = new int[101]; 	// 0 ~ 100 까지 담길 수 있는 101칸 배열

    // arr배열의 값을 돌면서 100-arr[i]인 수가 이전에 등장한 적 있으면 1, 없으면 0
    // 예) 100-4= 96, 등장한 적 없으니 0인데, 96 입장에서는 4가 등장했으니 4에 +1
    for(int i=0; i<n; i++) {
        if(count[100 - arr[i]] == 1) {
            return 1;
        }
        count[arr[i]] = 1;
    }
    return 0;
}

 

 

=> 시간복잡도 O(N)

 

N개의 원소를 도는 동안 합이 100인 쌍을 찾지 못했으면 0 반환, 

나와 합이 100이 되는 원소를 매 순간마다 O(1)에 찾고 이 행위를 N번 반복하기 때문