λ³Έλ¬Έ λ°”λ‘œκ°€κΈ°
πŸƒ algorithm/leetcode

LeetCode 238 - Product of Array Except Self (Medium)

by HandHand 2023. 4. 24.

 

πŸ’‘ 문제

LeetCode - 238번

 

🎯 풀이 κ³Όμ •

λ°°μ—΄ num μ—μ„œ i 번째 μš”μ†Œλ§Œ μ œμ™Έν•œ λ‚˜λ¨Έμ§€ μš”μ†Œλ“€μ˜ 곱을 i 번째 μΈλ±μŠ€μ— ν• λ‹Ήν•œ κ²°κ³Όλ₯Ό λ°˜ν™˜ν•΄μ•Όν•©λ‹ˆλ‹€.

μ΄λ•Œ O(n) 의 μ‹œκ°„λ³΅μž‘λ„λ‘œ μˆ˜ν–‰λ˜μ–΄μ•Όν•˜κ³ , λ‚˜λˆ„κΈ° 연산을 μ‚¬μš©ν•˜λ©΄ μ•ˆλ˜λŠ” μ œμ•½μ‘°κ±΄μ΄ μžˆμŠ΅λ‹ˆλ‹€.

이λ₯Ό μœ„ν•΄μ„œ i 번째 μš”μ†Œλ₯Ό μ œμ™Έν•œ λ‚˜λ¨Έμ§€ μš”μ†Œλ“€μ˜ 곱을 λ‹€μŒκ³Ό 같이 λ‚˜λˆ μ„œ 생각할 수 μžˆμŠ΅λ‹ˆλ‹€.

 

answer[i] = num[0...i-1] * num[i+1...]

 

λΆ€λΆ„ν•© μ•Œκ³ λ¦¬μ¦˜μ„ μ°¨μš©ν•˜λ©΄, μœ„μ—μ„œ ν•„μš”ν•œ ꡬ간곱을 미리 계산해놓을 수 μžˆμŠ΅λ‹ˆλ‹€.

ν•œ λ°°μ—΄μ—λŠ” μ™Όμͺ½μ—μ„œλΆ€ν„° λˆ„μ ν•œ 곱을 μ €μž₯ν•˜κ³ , λ‹€λ₯Έ λ°°μ—΄μ—λŠ” 였λ₯Έμͺ½μ—μ„œλΆ€ν„° λˆ„μ ν•œ 곱을 μ €μž₯ν•©λ‹ˆλ‹€.

그러면 μœ„ 식은 λ‹€μŒκ³Ό 같이 λ°”κΏ”μ„œ 계산할 수 μžˆμŠ΅λ‹ˆλ‹€.

 

answer[i] = prefixLeft[i-1] * prefixRight[i+1]

 

πŸ‘¨‍πŸ’» μ½”λ“œ

/**
 * @param {number[]} nums
 * @return {number[]}
 */
var productExceptSelf = function(nums) {
    const leftPrefix = Array(nums.length).fill(0)
    leftPrefix[0] = nums[0]
    for (let idx = 1; idx < nums.length; idx += 1) {
        leftPrefix[idx] = leftPrefix[idx-1] * nums[idx]
    }

    const rightPrefix = Array(nums.length).fill(0) 
    rightPrefix[nums.length-1] = nums[nums.length-1]
    for (let idx = nums.length-2; idx >= 0; idx -= 1) {
        rightPrefix[idx] = rightPrefix[idx+1] * nums[idx]
    }

    const answer = Array(nums.length).fill(0)
    for (let idx = 0; idx < nums.length; idx += 1) {
        answer[idx] = (leftPrefix[idx-1] ?? 1) * (rightPrefix[idx+1] ?? 1)
    }

    return answer
};
λ°˜μ‘ν˜•

πŸ’¬ λŒ“κΈ€