문제 개요
배열 nums가 주어졌을 때, 이 배열 안에 '나머지 모든 요소들의 곱'과 값이 같은 요소가 존재하는지 확인하는 문제입니다.
예를 들어 입력이 nums = [3, 2, 24, 4, 1]이라면 출력은 True입니다. 그 이유는 24가 나머지 요소들의 곱(3 × 2 × 4 × 1 = 24)과 일치하기 때문입니다.
해결 접근 방식
이 문제는 다음 단계를 통해 해결할 수 있습니다.
- 곱을 저장할 변수
mul을 1로 초기화합니다. - 배열의 모든 요소를 순회하며
mul에 각 요소를 곱해 전체 곱을 구합니다. - 다시 배열을 순회하면서 각 요소
nums[i]가mul / nums[i](자기 자신을 제외한 나머지 요소들의 곱)와 같은지 확인합니다. - 조건을 만족하는 요소가 있으면 True를 반환하고, 끝까지 없으면 False를 반환합니다.
구현 코드
def solve(nums):
mul = 1
for i in range(len(nums)):
mul *= nums[i]
for i in range(len(nums)):
if nums[i] == mul / nums[i]:
return True
return False
nums = [3, 2, 24, 4, 1]
print(solve(nums))입력
[3, 2, 24, 4, 1]
출력
True
동작 원리 살펴보기
위 코드에서 첫 번째 루프는 배열 전체의 곱인 mul = 3 × 2 × 24 × 4 × 1 = 576을 계산합니다. 두 번째 루프에서는 각 요소에 대해 자기 자신을 제외한 곱을 비교합니다.
nums[0] = 3→ 576 / 3 = 192 ≠ 3nums[1] = 2→ 576 / 2 = 288 ≠ 2nums[2] = 24→ 576 / 24 = 24 ✓ 조건 만족!
따라서 함수는 True를 반환합니다.
복잡도 분석
- 시간 복잡도: O(n) — 배열을 두 번 순회하므로 선형 시간이 걸립니다.
- 공간 복잡도: O(1) — 추가 변수
mul하나만 사용합니다.
주의 사항
이 방법은 나눗셈 연산을 사용하기 때문에 배열에 0이 포함된 경우 주의해야 합니다. 0으로 나누게 되면 오류가 발생할 수 있으므로, 실제 구현 시에는 0의 개수를 세어 처리하는 로직을 추가하는 것이 안전합니다. 또한 정확한 정수 비교가 필요하다면 나눗셈 대신 전체 곱을 제수 없이 비교하는 방식(예: 각 위치별 좌우 누적 곱 활용)을 고려할 수 있습니다.