Skip to content

Product of Array Except Selfย #60

@hsskey

Description

@hsskey

๋ฌธ์ œ ์„ค๋ช… | Product of Array Except Self

์ •์ˆ˜ ๋ฐฐ์—ด nums๊ฐ€ ์ฃผ์–ด์งˆ ๋•Œ, ๊ฐ ์š”์†Œ์˜ ์œ„์น˜์— ํ•ด๋‹น ์š”์†Œ๋ฅผ ์ œ์™ธํ•œ ๋ชจ๋“  ์š”์†Œ๋“ค์˜ ๊ณฑ์„ ๋‹ด์€ ๋ฐฐ์—ด์„ ๋ฐ˜ํ™˜ํ•˜๋Š” ๋ฌธ์ œ

๐Ÿ“ ์ œ์•ฝ์กฐ๊ฑด

  • ๋‚˜๋ˆ—์…ˆ ์—ฐ์‚ฐ์„ ์‚ฌ์šฉํ•˜์ง€ ์•Š๊ณ  ๋ฌธ์ œ๋ฅผ ํ•ด๊ฒฐ
  • O(n) ์‹œ๊ฐ„ ๋ณต์žก๋„๋กœ ํ•ด๊ฒฐ
  • O(1) ์ถ”๊ฐ€ ๊ณต๊ฐ„ ๋ณต์žก๋„๋กœ ํ•ด๊ฒฐ

๐Ÿ’ก ์˜ˆ์‹œ

  • Input: [1,2,3,4]
    • Output: [24,12,8,6]
    • ์„ค๋ช…:
      • 1๋ฒˆ ์œ„์น˜: 2 * 3 * 4 = 24
      • 2๋ฒˆ ์œ„์น˜: 1 * 3 * 4 = 12
      • 3๋ฒˆ ์œ„์น˜: 1 * 2 * 4 = 8
      • 4๋ฒˆ ์œ„์น˜: 1 * 2 * 3 = 6

๋ฌธ์ œ ํ•ด๊ฒฐ ๊ณผ์ •

Step 1: ๋ฌธ์ œ ์ดํ•ดํ•˜๊ธฐ

  • ์ž‘์€ ์˜ˆ์‹œ๋ฅผ ํ†ตํ•ด ์ดํ•ดํ•˜๊ธฐ

    • [1,2,3,4] โ†’ [24,12,8,6]
    • ๊ฐ ์œ„์น˜์˜ ๊ฐ’์€ ์ž์‹ ์„ ์ œ์™ธํ•œ ๋‹ค๋ฅธ ๋ชจ๋“  ์š”์†Œ์˜ ๊ณฑ
  • ์ œ์•ฝ์‚ฌํ•ญ ๊ฒ€ํ† :

    • ๋‚˜๋ˆ—์…ˆ ์—†์ด ๊ตฌํ˜„ํ•ด์•ผ ํ•จ
    • O(N) ์‹œ๊ฐ„ ๋ณต์žก๋„ ํ•„์š”
    • O(1) ์ถ”๊ฐ€ ๊ณต๊ฐ„ ๋ณต์žก๋„ ํ•„์š”

Step 2: ์ ‘๊ทผ ๋ฐฉ๋ฒ•

  • ์ง๊ด€์ ์œผ๋กœ ์ƒ๊ฐํ•˜๊ธฐ

    • ๊ฐ€์žฅ ๋‹จ์ˆœํ•œ ๋ฐฉ๋ฒ•์€ ์ด์ค‘ ๋ฐ˜๋ณต๋ฌธ์„ ์‚ฌ์šฉํ•˜๋Š” ๊ฒƒ์ด์ง€๋งŒ, ์‹œ๊ฐ„๋ณต์žก๋„๊ฐ€ O(Nยฒ)
    • O(N)์œผ๋กœ ํ•ด๊ฒฐํ•˜๋ ค๋ฉด ๋ฐฐ์—ด์„ ํ•œ ๋ฒˆ๋งŒ ์ˆœํšŒ
  • ๋ฌธ์ œ ์ƒํ™ฉ ๋‹จ์ˆœํ™”

    • ๊ฐ ์œ„์น˜์˜ ๊ฐ’์€ "์™ผ์ชฝ ์š”์†Œ๋“ค์˜ ๊ณฑ" ร— "์˜ค๋ฅธ์ชฝ ์š”์†Œ๋“ค์˜ ๊ณฑ"์œผ๋กœ ์ƒ๊ฐ
    • ์˜ˆ: [1,2,3,4]์—์„œ 3๋ฒˆ์งธ ์œ„์น˜(๊ฐ’ 3)์˜ ๊ฒฐ๊ณผ๋Š” (1ร—2) ร— (4) = 8
  • ์•Œ๊ณ ๋ฆฌ์ฆ˜ ํ‘œ ๊ตฌ์ƒ

    1. ์™ผ์ชฝ์—์„œ ์˜ค๋ฅธ์ชฝ์œผ๋กœ ๋ˆ„์  ๊ณฑ ๊ณ„์‚ฐ
       i = 0, prefix = 1
       โ†“
       res[i] = prefix (ํ˜„์žฌ ์œ„์น˜ ์™ผ์ชฝ์˜ ๋ชจ๋“  ์š”์†Œ ๊ณฑ)
       โ†“
       prefix *= nums[i] (๋‹ค์Œ ์œ„์น˜๋ฅผ ์œ„ํ•œ ๋ˆ„์  ๊ณฑ ์—…๋ฐ์ดํŠธ)
       โ†“
       i++ ํ•˜๊ณ  ๋ฐ˜๋ณต
       
    2. ์˜ค๋ฅธ์ชฝ์—์„œ ์™ผ์ชฝ์œผ๋กœ ๋ˆ„์  ๊ณฑ ๊ณ„์‚ฐ
       i = n-1, postfix = 1
       โ†“
       res[i] *= postfix (๊ธฐ์กด ๊ฐ’์— ์˜ค๋ฅธ์ชฝ ์š”์†Œ๋“ค์˜ ๊ณฑ ๊ณฑํ•˜๊ธฐ)
       โ†“
       postfix *= nums[i] (๋‹ค์Œ ์œ„์น˜๋ฅผ ์œ„ํ•œ ๋ˆ„์  ๊ณฑ ์—…๋ฐ์ดํŠธ)
       โ†“
       i-- ํ•˜๊ณ  ๋ฐ˜๋ณต
    

Step 3: ์ฝ”๋“œ ์„ค๊ณ„

  1. ๊ฒฐ๊ณผ ๋ฐฐ์—ด res ์ƒ์„ฑ
  2. ์™ผ์ชฝ์—์„œ ์˜ค๋ฅธ์ชฝ์œผ๋กœ ์ˆœํšŒํ•˜๋ฉฐ ์™ผ์ชฝ ๋ˆ„์  ๊ณฑ ์ €์žฅ
    • prefix ๋ณ€์ˆ˜๋ฅผ 1๋กœ ์ดˆ๊ธฐํ™”
    • ๊ฐ ์œ„์น˜์— prefix ๊ฐ’ ์ €์žฅ ํ›„ prefix์— ํ˜„์žฌ ๊ฐ’ ๊ณฑํ•˜๊ธฐ
  3. ์˜ค๋ฅธ์ชฝ์—์„œ ์™ผ์ชฝ์œผ๋กœ ์ˆœํšŒํ•˜๋ฉฐ ์˜ค๋ฅธ์ชฝ ๋ˆ„์  ๊ณฑ ๋ฐ˜์˜
    • postfix ๋ณ€์ˆ˜๋ฅผ 1๋กœ ์ดˆ๊ธฐํ™”
    • ๊ฐ ์œ„์น˜์˜ ๊ฐ’์— postfix ๊ณฑํ•˜๊ธฐ ํ›„ postfix์— ํ˜„์žฌ ๊ฐ’ ๊ณฑํ•˜๊ธฐ
  4. ๊ฒฐ๊ณผ ๋ฐฐ์—ด ๋ฐ˜ํ™˜

Step 4: ์ฝ”๋“œ ๊ตฌํ˜„

/**
 * @param {number[]} nums
 * @return {number[]}
 */
var productExceptSelf = function(nums) {
    const res = Array(nums.length);
    
    // ์™ผ์ชฝ์—์„œ ์˜ค๋ฅธ์ชฝ์œผ๋กœ ๋ˆ„์  ๊ณฑ ๊ณ„์‚ฐ
    let prefix = 1;
    for(let i = 0; i < nums.length; i++) {
        res[i] = prefix;
        prefix *= nums[i];
    }
    
    // ์˜ค๋ฅธ์ชฝ์—์„œ ์™ผ์ชฝ์œผ๋กœ ๋ˆ„์  ๊ณฑ ๊ณ„์‚ฐ
    let postfix = 1;
    for(let i = nums.length - 1; i >= 0; i--) {
        res[i] *= postfix;  // ์™ผ์ชฝ ๋ˆ„์  ๊ณฑ์— ์˜ค๋ฅธ์ชฝ ๋ˆ„์  ๊ณฑ ๊ณฑํ•˜๊ธฐ
        postfix *= nums[i];
    }
    
    return res;
};

๋ณต์žก๋„ ๋ถ„์„

  • ์‹œ๊ฐ„ ๋ณต์žก๋„: O(N) - ๋ฐฐ์—ด์„ ๋‘ ๋ฒˆ ์ˆœํšŒํ•˜์ง€๋งŒ ๊ฐ๊ฐ O(N)์ด๋ฏ€๋กœ ์ด ๋ณต์žก๋„๋Š” O(N)
  • ๊ณต๊ฐ„ ๋ณต์žก๋„: O(1) - ๊ฒฐ๊ณผ ๋ฐฐ์—ด ์™ธ ์ถ”๊ฐ€ ๋ฐฐ์—ด ์—†์ด ๋ณ€์ˆ˜๋งŒ ์‚ฌ์šฉ

๊ฒ€์ฆ

  • ์˜ˆ์‹œ [1,2,3,4]๋กœ ์‹คํ–‰ํ•ด๋ณด๊ธฐ:
    1. ์ฒซ ๋ฒˆ์งธ ๋ฐ˜๋ณต๋ฌธ ํ›„: res = [1, 1, 2, 6]
    2. ๋‘ ๋ฒˆ์งธ ๋ฐ˜๋ณต๋ฌธ ํ›„: res = [24, 12, 8, 6]

Metadata

Metadata

Assignees

No one assigned

    Labels

    Projects

    No projects

    Milestone

    No milestone

    Relationships

    None yet

    Development

    No branches or pull requests

    Issue actions