[LeetCode] Set Mismatch

준규·2023년 4월 10일
0

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.

Find the number that occurs twice and the number that is missing and return them in the form of an array.


길이가 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.풀이

  1. 배열을 순회하면서 각 숫자의 등장 횟수를 map에 저장한다.
  2. map에서 value 값이 2 이상인 key 값을 result 배열에 저장한다.
  3. 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.결과

profile
안녕하세요 :)

0개의 댓글