배열에는 0부터 n까지의 숫자가 저장되어 있지만 배열의 크기는 n과 같아 0부터 n까지의 숫자 중 배열에 없는 숫자가 존재하는데 이 배열에 없는 숫자를 찾아야합니다.
첫번째 풀이
제 첫번째 풀이는 정렬을 사용했습니다. 정렬을 하면 0부터 큰 숫자대로 정렬되기 때문에 index와 value가 같게됩니다.
이때 index와 value가 다르면 그 index인 숫자가 배열에 없는 것 입니다.
int missingNumber(vector<int>& nums) {
int n = nums.size();
std::sort(nums.begin(), nums.end()); // 정렬
for (int i = 0; i < n; i++) {
if (nums[i] != i) // index와 value가 다르면 index 숫자가 없는 것
return i;
}
return n; // 0부터 n-1이 다 있으면 n이 없다
}
두 번째 풀이
0부터 n까지의 숫자를 다 있는지 알아야 한다면 결국 0부터 n까지의 합이 배열에 저장된 값들의 합과 같아야 합니다.
그러므로 없는 숫자를 알기 위해서는 0부터 n까지의 합 - 배열에 저장된 값들의 합 = 배열에 없는 숫자가 됩니다.
int missingNumber(vector<int>& nums) {
int n = nums.size();
int sum = 0;
int sumOfarray = 0;
for (int i = 0; i < nums.size(); i++)
{
sum += i;
sumOfarray += nums[i];
}
// 0부터 n까지의 합이므로 n을 더 해주고 빼기
return (nums.size() + sum) - sumOfarray;
}
이때 0부터 n까지의 숫자의 합을 한번에 계산할 수 있는 수식이 있습니다. 등차수열의 합의 공식을 사용하면 1부터 n까지 숫자의 합을 구할 수 있습니다. (0은 더해줘도 덧셈에는 영향이 없습니다.)
공식 : N * (N + 1) / 2
int missingNumber(vector<int>& nums) {
int n = nums.size();
int sumOfn = n * (n + 1) / 2; // 등차수열의 합 공식 (1부터 n까지의 수의 합, 0은 더해도 영향이 없다)
for (int& i : nums)
sumOfn -= i; // 배열에 저장된 모든 값을 빼기
return sumOfn; // 남은 값은 배열에 없는 숫자와 같다.
}
'Algorithm 문제풀이 > Leetcode' 카테고리의 다른 글
(Easy - BFS) Leetcode - 111. Minimum Depth of Binary Tree (0) | 2024.06.19 |
---|---|
(Easy - BFS) Leetcode - 637. Average of Levels in Binary Tree (0) | 2024.06.19 |
(Easy - Array) Leetcode - 2022. Convert 1D Array Into 2D Array (0) | 2024.06.18 |
(Easy - Arrays) Leetcode - 136. Single Number (0) | 2024.06.17 |
(Easy - Arrays) Leetcode - 217. Contains Duplicate (0) | 2024.06.13 |