[LeetCode] 238. Product of Array Except Self

임혁진·2022년 8월 19일
0

알고리즘

목록 보기
10/64
post-thumbnail

238. Product of Array Except Self

문제링크: https://leetcode.com/problems/product-of-array-except-self/

자기 원소를 제외한 나머지의 곱을 보여주는 배열을 얻는 문제이다.

Solution

Iteration with condition check

Product는 0이 포함되면 0이 되기 때문에 0의 존재를 기준으로 다음과 같이 기준을 세웠다.

  1. 0이 없는 경우: 전체 Product값을 구하고 자신의 원소로 나눠 구한다.
  2. 0이 1개 있는 경우: 0이 없는 부분은 모두 0이 되고 0인 부분은 나머지의 Product로 구한다.
  3. 0이 2개 이상인 경우: 모두 0이된다.

Algorithm

  • 0의 개수 조건을 확인하기 위해 zeroIndex라는 변수를 사용한다.
  • 0이 없는 경우 -1이고 존재가 확인되면 0의 index를 저장한다.
  • 전체 배열을 순회하면서 0이 아닐 경우 곱해 전체 product를 갱신하고 0을 만날 경우 zeroIndex를 변화, 이미 한번의 0이 존재했다면 모두 0인 배열을 반환한다.
  • 최종적으로 0의 개수에 맞춰 1, 2조건의 결과도 반환한다.
var productExceptSelf = function(nums) {
    // 1. 0이 없는 경우: TotalProduct(reduce)를 구해서 자기 원소로 나눈다.(map)
    // 2. 0이 하나만 있는 경우: 0자리만 나머지 product를 해주고 나머지는 0
    // 3. 0이 두 개 이상: 모두 0
    let zeroIndex = -1; // 음수: zero가 없음, 0이상: zero가 발견됨
    let totalProduct = 1;
    for (let i = 0; i < nums.length; i++) {
        if (nums[i] === 0) {
            // 3번 경우의 수 (zero가 두 번째 발견됨)
            if (zeroIndex >= 0) return Array(nums.length).fill(0);
            else zeroIndex = i;
        } else {
            totalProduct *= nums[i]
        }
    }
    // 2번 경우의 수 (zero가 한 번 발견됨)
    if (zeroIndex >= 0) {
        const result = new Array(nums.length).fill(0);
        result[zeroIndex] = totalProduct;
        return result;
    } else {
        // 1번 경우의 수 (zero가 없음)
        return nums.map((el) => totalProduct / el);
    }
};

profile
TIL과 알고리즘

0개의 댓글