[leetCode] 977. Squares of a Sorted Array

GY·2021년 11월 5일
0

알고리즘 문제 풀이

목록 보기
52/92
post-thumbnail

🎆 Description

Given an integer array nums sorted in non-decreasing order,
eturn an array of the squares of each number sorted in non-decreasing order.

Example 1:

Input: nums = [-4,-1,0,3,10]
Output: [0,1,9,16,100]
Explanation: After squaring, the array becomes [16,1,0,9,100].
After sorting, it becomes [0,1,9,16,100].
Example 2:

Input: nums = [-7,-3,2,3,11]
Output: [4,9,9,49,121]

🎇 Solution

var sortedSquares = function(nums) {
    let low = 0;
    let high = nums.length - 1;
    let output = [];
    
    while(low <= high) {
        if (nums[low]**2 > nums[high]**2) {
            output.push(nums[low]**2);
            low++;
        } else {
            output.push(nums[high]**2);
            high--;
        }
    }
    return output.reverse();
};

two pointers

  • 각 끝부터 low와 high포인터가 가리키는 값의 제곱값을 비교한다.
  • 그 중 더 큰 값을 배열에 푸시한다.
  • 더 큰 값을 가져 이미 푸시한 값의 포인터를 옮긴다. low값을 푸시했다면 low포인터++; 반대도 마찬가지이다.
  • 배열요소의 갯수는 홀수 일 수 있다. 따라서 조건은 while(low <= high) low와 high가 같을 경우도 고려해야 한다.

왜 내림차순으로 푸시한뒤 reverse()를?

기본적으로 배열은 마지막에 푸시되기 때문이다.
두 포인터의 값을 비교해 큰 수부터 푸시하면 자연스럽게 내림차순으로 정렬이된다.
하지만 작은 수부터 푸시하면 가장 최근에 비교한 더 작은 값을 그 이전, 가장 첫번째 인덱스에 넣어야 한다.
해도 되지만, 굳이 다른 메서드를 써야하기 때문에 그냥 간단히 푸시하고 마지막에 역순으로 정렬해주었다.

profile
Why?에서 시작해 How를 찾는 과정을 좋아합니다. 그 고민과 성장의 과정을 꾸준히 기록하고자 합니다.

0개의 댓글