codility lesson 03 TimeComplexity PermMissingElem
문제
An array A consisting of N different integers is given. The array contains integers in the range [1..(N + 1)], which means that exactly one element is missing.
Your goal is to find that missing element.
Write a function:
function solution(A);
that, given an array A, returns the value of the missing element.
For example, given array A such that:
A[0] = 2
A[1] = 3
A[2] = 1
A[3] = 5
the function should return 4, as it is the missing element.Write an efficient algorithm for the following assumptions:
N is an integer within the range [0..100,000];
the elements of A are all distinct;
each element of array A is an integer within the range [1..(N + 1)].
문제해설 : 각각 다른 integer N으로 주어진 배열 A가 존재합니다.. 이 배열은 [1…(N + 1)]의 범위를 가지고 하나의 요소가 비어있습니다.
당신의 목표는 비어있는 요소를 찾아내는 것입니다.
함수 solution(A)를 작성하세요.
주어진 배열 A에서 비어있는 요소를 리턴하세요
예를 들면 배열 A는 다음과 같습니다.
A[0] = 2
A[1] = 3
A[2] = 1
A[3] = 5
함수는 비어있는 요소 4를 리턴해야 합니다.
다음 가정을 토대로 효율적인 알고리즘을 작성하세요.
- N은 integer이며 [0…100,000]의 범위를 가집니다.
- 배열 A의 요소는 모두 서로 다릅니다.
- 배열 A의 각 요소는 [1…(N + 1)]의 범위의 integer입니다.
답안 해설
내가 작성한 코드 :
- js
1 | function solution(A) { |
주어진 배열 A를 정렬할 sortedArr 배열을 생성하였다.
for문을 순회하면서 각 배열의 요소가 index+1이 아니면 순회를 멈추고 해당 index + 1값 즉, 비어있는 값을 리턴한다.
기본적인 로직은 위와 같고 예외 케이스를 처리해 주었다.
비어 있는 값이 1일 경우 순회를 전부 할 필요도 없기 때문에 바로 리턴해주었다.
테스트 결과를 제출하고 성적을 받아보았는데 90%이다…
이유를 찾아보니 empty list and single element 케이스에서 런타임 에러가 났다.
예외처리를 더 해주지 않은 것이다.
이유를 찾아보니 배열의 길이가 0인 케이스도 생각해주어야 한다.
(당연히 배열은 빈배열이 아닐 줄 알았는데…)
A = [];
이 케이스의 경우 비어있는 값은 1이 되므로 맨 위쪽에서 바로 리턴해 주었다.
테스트 결과 100%가 되었으며 시간 복잡도는 최선일 경우 O(N)이며 최악의 경우는O(N * log(N))이다.
다른 방법으로 작성한 코드 :
- js
1 | function solution(A) { |
1 ~ N + 1까지의 합을 구한 후 배열 A의 모든 요소를 더한 값을 빼면 비어있는 값을 얻을 수 있다.