본문 바로가기
DS & Algo/풀이모음

[leetcode/JS] 724_Find Pivot Index 풀이

by 5kdk 2022. 11. 12.

🎲 문제

정수 배열 nums가 주어지면, 이 배열의 pivot index 계산합니다.

pivot index 는 피벗 인덱스는 인덱스 왼쪽에 있는 모든 숫자의 합이 인덱스 오른쪽에 있는 모든 숫자의 합과 같은 인덱스입니다.

인덱스가 배열의 왼쪽 가장자리에 있으면 왼쪽에 요소가 없기 때문에 왼쪽 합계는 0 입니다.

이는 어레이의 오른쪽 가장자리에도 적용됩니다.

가장 왼쪽의 피벗 인덱스를 반환합니다. 해당 인덱스가 없으면 -1 을 반환합니다

 

 

Example 1:

Input: nums = [1,7,3,6,5,6]
Output: 3
Explanation:
The pivot index is 3.
Left sum = nums[0] + nums[1] + nums[2] = 1 + 7 + 3 = 11
Right sum = nums[4] + nums[5] = 5 + 6 = 11

Example 2:

Input: nums = [1,2,3]
Output: -1
Explanation:
There is no index that satisfies the conditions in the problem statement.

Example 3:

Input: nums = [2,1,-1]
Output: 0
Explanation:
The pivot index is 0.
Left sum = 0 (no elements to the left of index 0)
Right sum = nums[1] + nums[2] = 1 + -1 = 0

 

Constraints:

  • 1 <= nums.length <= 104
  • -1000 <= nums[i] <= 1000

 

Note: This question is the same as 1991: https://leetcode.com/problems/find-the-middle-index-in-array/

 


💡 접근방법

  • pivot 인덱스 조건은 좌 우의 합이 같은 idx
  • flow 1. 이를 확인하기 위해 전체 합을 구하기
  • flow 2. 배열을 for loof로 탐색하며 누적된 왼쪽 값과, 해당 인덱스를 전체 요소의 합과의 차가 같을 경우, pivot 인덱스 이기때문에 해당 인덱스를 반환.
  • flow 3. 아닐 경우 왼쪽 값 누적.
  • flow 4. 위 조건을 모두 만족하지 않을경우 (for loof 가 다 돌때까지 return이 없는경우 -1 반환)

 

var pivotIndex = function (nums) {
  const total = nums.reduce((acc, num) => acc + num);
  let left = 0;

  for (let idx = 0; idx < nums.length; idx++) {
    if (left === total - left - nums[idx]) {
      return idx;
    } else {
      left += nums[idx];
    }
  }
  return -1;
};
 

📖 후기

문제 이해하는데에 시간이 좀 걸렸다. for loof 와 구간합으로 해결할 수도 있지만

투포인터(Two-Pointers) 알고리즘을 떠올린 후  간단하게 문제를 해결할 수 있었다,

해당 알고리즘에 대해 한번 더 곱씹을 수 있는 문제였다.

댓글