A-006● Day 062026.05.08mediumleetcode #238neetcode150
자신을 제외한 배열의 곱
#array#prefix-sum
01
문제
· problem정수 배열 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
// 지문은 본인 언어 요약 — 원문은 위 링크에서
입출력 예시
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머릿속 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 펼침.