https://leetcode.com/problems/product-of-array-except-self/description/
- 배열을 입력받아 output[i]가 자신을 제외한 나머지 모든 엘리먼트의 곱셈 결과가 되도록 출력하라
- 나눗셈을 하지 않고 O(n)에 풀이
풀이 1) 왼쪽 곱셈 결과에 오른쪽 값을 차례대로 곱하기
- 나눗셈을 하지 않고 O(n)에 풀이하라는 조건이 있으므로 미리 전체 곱셈 값을 구해놓고 각 항목별로 자기 자신을 나눠서 풀이하는 방법은 안됨
- 가능한 풀이법은 자기 자신을 제외하고 왼쪽의 곱셈 결과와 오른쪽의 곱셈 결과를 곱하는 방법
- 곱셈 결과는 p 변수에 저장하고 먼저 왼쪽부터 p에 곱해나간다.
- 곱셈 결과는 그대로 정수형 배열 result[]에 담기며, 마지막 값 곱셈 값을 제외하며 result의 값은 [1,1,3,15]가 된다.
//왼쪽 곱셈
int p = 1;
for(int i=0; i<nums.length; i++)
{
result[i] = p;
//왼쪽 곱셈 결과
p*=nums[i];
}
- 기존 result 변수를 재활용하여 반대로 오른쪽에서 곱한 결과를 넣어본다.
- 왼쪽의 곱셈 결과에 오른쪽 마지막 값부터 차례대로 곱한다.
//오른쪽 곱셈, 왼쪽 곱셈 결과에 차례대로 곱하기
p=1;
for(int i=nums.length-1; i>=0; i--)
{
result[i] *=p;
//오른쪽 곱셈 결과
p*=nums[i];
}
- 여기서 p는 1부터 시작해 차례대로 오른쪽 곱셈 결과로 1,7,35,105가 되고 최종적으로 이 값이 왼쪽 곱셈 결과에 뒤부터 곱해지면서 result 변수에는 정답인 [105,35,21,15]가 담긴다.
class Solution {
public int[] productExceptSelf(int[] nums) {
int result[] = new int[nums.length];
//왼쪽 곱셈
int p = 1;
for(int i=0; i<nums.length; i++)
{
result[i] = p;
//왼쪽 곱셈 결과
p*=nums[i];
}
//오른쪽 곱셈, 왼쪽 곱셈 결과에 차례대로 곱하기
p=1;
for(int i=nums.length-1; i>=0; i--)
{
result[i] *=p;
//오른쪽 곱셈 결과
p*=nums[i];
}
return result;
}
}
실행시간 : 2밀리초
'Java > 알고리즘' 카테고리의 다른 글
[자바 알고리즘 인터뷰] 8장 연결 리스트(1) 팰린드롬 연결 리스트 (0) | 2024.05.03 |
---|---|
[자바 알고리즘 인터뷰] 7장 배열(6) - 주식을 사고팔기 가장 좋은 시점 (0) | 2024.05.01 |
[자바 알고리즘 인터뷰] 7장 배열 (4) 배열 파티션 1 (0) | 2024.04.06 |
[자바 알고리즘 인터뷰] 7장 배열 (3) 세 수의 합 (1) | 2024.04.06 |
[자바 알고리즘 인터뷰] 7장 배열 (2) 빗물 트래핑 (1) | 2024.04.05 |