본문 바로가기

ALGORITHM/c&c++ leetcode

[C/LeetCode] Arithmetic Slices

뭘 풀지 모를때는 역시 daily 추천 문제를 푸는 것이 좋다

 

Difficulty: Medium

Submission: 177ms/ 6.1MB

여전히 효율이 좋은 코드를 생각하는 버릇이 안들었다. 일단 돌아가면 되지 라는 무지성 코딩 제발 그만해 이러다간 다 죽어

 

int numberOfArithmeticSlices(int* nums, int numsSize){
    int result = 0;
    int diff = 0;
    int signal = 1;
    
    // 3개부터 시작해서 몇개까지로 이루어진 sequence를 만들 수 있는지
    for(int i = 3;i <= numsSize;i++)
    {
    	// 그렇다면 i개의 subarray을 위해 몇번 돌아야 하는지 
        for(int j = 0;j < numsSize - i + 1;j++)
        {
            signal = 1;
            diff = nums[j] - nums[j+1];
            // subarray 안에서 몇번 돌아야 하는지
            for(int k = j;k + i - 1 <= numsSize;k++)
            {
            	// 다른 경우 signal을 0으로 하고 break
                if (nums[k] - nums[k + 1] != diff)
                {
                    signal = 0;
                    break;
                }
            }
            // signal이 여전히 1인 경우 가능한 것이므로 결과값+=1
            if (signal == 1)
                result++;
        }
    }
    return result;
}

 

반복문을 돌면서 배열을 점검하는 형태의 코드를 작성해보았다.

3개부터 가능한 수열로 확인하기 때문에 3부터 배열의 크기까지 확인을 해서 몇개까지로 이루어진 수열을 만들 수 있는지 확인한다.

 

그 후에는 3~numsSize 의 subArray는 각각 몇번의 배열을 돌면서 확인해야 하는지 또 반복문을 돌면서 확인한다.

이는 subArray의 시작 인덱스로도 활용 가능하다.

 

subArray에서는 이게 가능한 수열인지 확인해준다. 즉 diff 값과 다르다면 가능하지 않기 때문에 signal을 0으로 하고 탈출한다.

이 경우 signal이 0이라면 가능하지 않기 때문에 결과값을 증가시키지 않는다.