개발관련

[codility] PermMissingElem

hjaelife 2023. 7. 29. 16:26

(문제) 크기가 N이며 [1..N+1] 사이의 서로 다른 원소를 가지는 배열 A에서 빠진 원소를 찾는 함수 작성

 

(my solution)

- 문제를 잘못 해석했다. 예를 들어 N = 4이고 A = {1, 2, 3, 4} 값을 가지면 1부터 순차적인 값을 가졌으므로 빠진 값이 없다고 잘못 생각했다. (문제 마음대로 해석하지 말고 제대로 읽어라... 부들부들)

- 중복 값이 없고 배열에 어떤 값이 있는 지 O(1)으로 바로 찾고 싶을 때마다 HashSet으로 푸는 것 같다.

- 잘못된 해결법은 아니지만 1) 별도의 메모리 공간이 필요  2) 배열의 크기만큼 순회하면서 HashSet에 값을 넣어야 함. 두 가지 이유로 더 좋은 해결법이 있다면 그 방법으로 푸는 게 좋을 것 같다.

- sum을 이용하면 더 심플하게 풀었다. (문제만 제대로 이해했으면 1분도 안 되서 풀 문제를.... 부들부들)

package codility.tasks;

import java.util.HashSet;

public class PermMissingElem {
    public static int solution(int[] A) {
        if (A.length == 0) {
            return 1;
        }

        HashSet<Integer> hashA = new HashSet<>();
        for (int value : A) {
            hashA.add(value);
        }

        for (int i = 1; i <= A.length + 1; ++i) {
            if (!hashA.contains(i)) {
                return i;
            }
        }

        return -1;
    }
}

 

 

(chatGPT)

class Solution {
    public int solution(int[] A) {
        int N = A.length;
        int totalSum = (N + 1) * (N + 2) / 2; // Sum of integers from 1 to N+1
        int arraySum = 0; // Sum of elements in array A

        for (int num : A) {
            arraySum += num;
        }

        int missingElement = totalSum - arraySum;
        return missingElement;
    }
}