전체 회차
A-006Day 062026.05.08mediumleetcode #238neetcode150

자신을 제외한 배열의 곱

#array#prefix-sum
leetcode #238 · product-of-array-except-self
01

문제

· problem
P.006

자신을 제외한 배열의 곱

leetcode #238

정수 배열 nums가 주어졌을 때, answer[i]가 nums[i]를 제외한 nums의 모든 원소의 곱이 되도록 하는 배열 answer를 반환하세요. nums의 어떤 prefix 또는 suffix의 곱도 32비트 정수에 맞다고 보장됩니다. O(n) 시간에 작동하는 알고리즘을 작성해야 하며, 나눗셈 연산을 사용할 수 없습니다.

제약
  • · 2 ≤ nums.length ≤ 10⁵
  • · −30 ≤ nums[i] ≤ 30
  • · Division operation is forbidden
  • · answer[i] guaranteed to fit in 32-bit integer
// 지문은 본인 언어 요약 — 원문은 위 링크에서
입출력 예시
example 1input → output
[1,2,3,4]
[24,12,8,6]
example 2input → output
[-1,1,0,-3,3]
[0,0,9,0,0]
02

사전 사고

· pre-solve
● 1리스트 출력● 2선택● 3정답 공개
  • 배열에 0이 포함되어 있으면 어떻게 해야 하나요?
  • 입력 배열을 수정해도 괜찮나요?
  • 나눗셈을 사용하면 안 되는 이유가 뭘까요?
  • 전체 곱을 먼저 계산한 후, 각 원소로 나누는 방법은 어떤가요?
  • 해시맵을 사용해서 이전 곱들을 저장하면 더 명확할까요?
  • 음수가 포함된 경우 특별히 처리해야 하나요?
  • prefix와 suffix를 계산할 때, 별도의 배열이 필요한가요?
던질 질문에 체크하고 확인을 누르세요
// 결과는 세션 메모리만 — 새로고침하면 초기화됩니다 (반복 학습)
03

논리 구조

· logic
● 1슬롯 출력● 2슬롯별 선택● 3정답 공개
// 각 슬롯에 들어갈 코드 한 줄을 골라 알고리즘 흐름을 합성해보세요. 코드는 안 짜지만 논리 뼈대는 직접.
step 1· 결과 배열을 1로 초기화
res = [1] * (len(nums))
res = [0] * (len(nums))
res = nums[:]
step 2· 좌측 Prefix 루프중첩
for i in range(1, len(nums)):
for i in range(len(nums)):
for i in range(len(nums) - 1):
step 3· Prefix 누적 계산│ │ 중첩
res[i] = res[i-1] * nums[i-1]
res[i] = res[i-1] * nums[i]
res[i] += res[i-1] * nums[i-1]
step 4· Suffix 변수 초기화
postfix = 1
postfix = 0
postfix = nums[-1]
step 5· 우측 Suffix 루프중첩
for i in range(len(nums) - 1, -1, -1):
for i in range(len(nums)):
for i in range(len(nums) - 1, 0, -1):
step 6· Suffix로 결과 업데이트│ │ 중첩
res[i] *= postfix
res[i] = postfix
res[i] += postfix
step 7· Suffix 누적 업데이트│ │ 중첩
postfix *= nums[i]
postfix += nums[i]
postfix = nums[i]
각 슬롯에 한 줄씩 골라보세요
// format: slot — 다른 패턴(재귀·DP 등) 은 ordering·state-first 등 별도 format. ADR-08 후속.
04

문제풀이 · 트레이스

· solve
solution.py
1
class Solution:
2
    def productExceptSelf(self, nums: List[int]) -> List[int]:
3
        res = [1] * (len(nums))
4
5
        for i in range(1, len(nums)):
6
            res[i] = res[i-1] * nums[i-1]
7
        postfix = 1
8
        for i in range(len(nums) - 1, -1, -1):
9
            res[i] *= postfix
10
            postfix *= nums[i]
11
        return res
머릿속 dry-run 케이스
// 각 케이스를 머릿속으로 따라가보세요. 막히면 아래 worked example 펼침.
case 1
[1,2,3,4]
[24,12,8,6]
case 2
[-1,1,0,-3,3]
[0,0,9,0,0]
// UI 가 walk-through 안 함 — 학습자가 머릿속으로. 막히면 worked example 펼침.