1.문제
You have a set of integers s, which originally contains all the numbers from 1 to n. Unfortunately, due to some error, one of the numbers in s got duplicated to another number in the set, which results in repetition of one number and loss of another number.
You are given an integer array nums representing the data status of this set after the error.
길이가 n인 숫자배열 nums에 어떤 숫자는 중복이 되어서 nums 배열에 생략된 수가 있다고 할 때 중복된 숫자와 생략된 숫자를 배열의 형태로 리턴하는 문제이다.
Example 1
Input: nums = [1,2,2,4]
Output: [2,3]
Example 2
Input: nums = [1,1]
Output: [1,2]
Constraints:
- 2 <= nums.length <= 10^4
- 1 <= nums[i] <= 10^4
2.풀이
- 배열을 순회하면서 각 숫자의 등장 횟수를 map에 저장한다.
- map에서 value 값이 2 이상인 key 값을 result 배열에 저장한다.
- 1~n까지의 숫자들 중에서 nums에 있지 않는 숫자를 result 배열에 저장한다.
/**
* @param {number[]} nums
* @return {number[]}
*/
const findErrorNums = function (nums) {
nums.sort((a, b) => a - b);
const map = {};
const result = [];
const n = nums.length;
// nums의 숫자들의 개수를 체크해서 map에 저장한다.
for (let i = 0; i < n; i++) {
if (map[nums[i]]) {
map[nums[i]] += 1;
} else {
map[nums[i]] = 1;
}
}
// map에서 개수가 2이상인 key값을 result 배열에 저장한다.
Object.keys(map).forEach((key) => {
if (map[key] > 1) {
result.push(parseInt(key));
}
});
//nums에서 생략된 수를 찾아서 result에 저장한다.
for (let i = 1; i <= n; i++) {
if (nums.indexOf(i) === -1) {
result.push(i);
}
}
return result;
};
3.결과