448. Find All Numbers Disappeared in an Array
2026-03-24
리트코드 448번 풀이
문제
Find All Numbers Disappeared in an Array
풀이 1
아이디어
배열을 Set으로 변환한 뒤, 1부터 n까지 순회하면서 Set에 없는 숫자를 결과에 추가한다.
코드
function findDisappearedNumbers(nums: number[]): number[] {
const numSet = new Set(nums);
const n = nums.length;
const ret: number[] = [];
for (let num = 1; num <= n; num++) {
if (!numSet.has(num)) ret.push(num);
}
return ret;
}시간 / 공간 복잡도
- 시간 복잡도: O(n)
- 공간 복잡도: O(n) — Set 저장 공간
풀이 2
아이디어
Leetcode의 도발에 넘어가 추가로 고민해본 풀이… (개인적으론 좀 억지로 푼 것 같다는 생각을 버릴 수 없다.)
Follow up: Could you do it without extra space and in O(n) runtime? You may assume the returned list does not count as extra space.
이 풀이에서는 배열 자체를 방문 표시판으로 활용한다. 숫자 num이 존재하면 인덱스 num - 1의 값을 음수로 표시하고, 마지막에 양수로 남아있는 인덱스가 빠진 숫자다.
추가 공간을 사용하지 않는다는 장점이 있지만, 원본 배열을 변경한다는 단점이 있다. 문제에서 허용하긴 했지만 side effect가 발생할 수 있으므로 상황에 따라 풀이 1이 더 나을 수 있다.
코드
function findDisappearedNumbers(nums: number[]): number[] {
for (const num of nums) {
const idx = Math.abs(num) - 1;
if (nums[idx] > 0) nums[idx] *= -1;
}
const ret: number[] = [];
for (let idx = 0; idx < nums.length; idx++) {
if (nums[idx] > 0) ret.push(idx + 1);
}
return ret;
}시간 / 공간 복잡도
- 시간 복잡도: O(n)
- 공간 복잡도: O(1) — 반환값 제외, 입력 배열만 사용