[Leetcode] 238. Product of Array Except Self

Algorithm|2021. 8. 1. 14:02
반응형

Identifying the Problem

자기 자신을 제외한 나머지 모든 곱을 수열로 리턴한다.

 

Input: nums = [1,2,3,4]

Output: [24,12,8,6]

Organizing thoughts

직관적인 방법으로 풀면 O(n²)로 금방 푼다.

하지만 어떤 문제를 풀든 O(n²) 보다 더 효율적으로 풀 수 있는 방법이 있다고 생각한다.

 

자세히 생각해 본 결과, 268 Missing number 문제의 알고리즘에서 해답을 얻었다. 

0~n까지 주어진 배열에서 빠진 숫자를 찾는 문제였다.

간단히 설명을 하면 0~n까지 다 더한 값과 수열을 다 더한 값을 뺏을 때 값이 답이었다.

게다가 0~n까지 다 더하는 과정은 등차수열 공식을 사용해 굳이 0~n 반복문을 하지 않아도 됐다.

 

 

[Leetcode] 268. Missing Number

Identifying the Problem 주어진 수열에서 없는 숫자를 파악한다. ex [3,0,1] 이면 2가 없으니 2를 리턴한다. Organizing thoughts 즉 배열의 수가 3칸이면 0,1,2,3 중 하나는 빠져있다는 거다. 그러면 전체가 다..

gold-goose.tistory.com

각설하고 268번 문제의 아이디어를 그대로 따오면

 

1. 반복문으로 처음에 수열의 모든 값을 곱한다.

2. 그 다음 반복문에 모든 값을 곱한 값을 탐색 중인 수로 나눈다.

3. 나눈 값으로 탐색 중인 수열을 채운다.

 

하지만 nums = [-1,1,0,-3,3] 같은 경우는 index = 2에서
곱한 모든 값 / 0 = ? 으로 0으로 나누는 경우가 발생한다.

더 생각해보자

<수열 내 0이 1개인 경우>

0인 부분은 0이 아닌 수의 모든 곱을 넣으면 된다. 

0이 아닌 부분은 0을 넣으면 된다.

 

<수열 내 0이 2개인 경우>

모든 값이 0이 된다.

 

Sourcecode

int* productExceptSelf(int* nums, int numsSize, int* returnSize)
{
    int multi = 1;
    int count = 0; //0의 개수
    
    *returnSize = numsSize;
   
    for(int i=0;i<numsSize ; i++)
    {        
        if(nums[i] !=0)
            multi *= nums[i];
        else 
            count ++;
    }
    
    for(int i=0;i<numsSize; i++)
    {   
        if(nums[i] !=0 && count ==0) //0이 없는 경우
            nums[i] = multi / nums[i];
        else if(nums[i] ==0 && count == 1) //0이 1개이고 0인경우
            nums[i] = multi;
        
        
        else //0이 2개 이상인 경우혹은 1개인데 0이 아닌 경우
            nums[i] = 0;
        

     }
    
    return nums;  
}

Mistake

신나게 다 짜 놓고 이 부분을 고려를 안 했다.

 

 

반응형

'Algorithm' 카테고리의 다른 글

[Leetcode] 94. Binary Tree Inorder Traversal  (0) 2021.08.03
[Leetcode] 69. Sqrt(x)  (0) 2021.08.03
[Leetcode] 202. Happy Number  (0) 2021.08.01
[Leetcode] 338. Counting Bits  (0) 2021.07.30
[Leetcode] 88. Merge Sorted Array  (0) 2021.07.30

댓글()