본문 바로가기

LeetCode

[LeetCode] - 2239. Find Closest Number to Zero

LeetCode는 프로그래밍 문제를 풀며 코딩 실력을 향상할 수 있는 온라인 플랫폼입니다. 다양한 알고리즘 및 데이터 구조 문제를 제공하며, 면접 대비에 유용합니다. 해당 문제는, LeetCode Problems에서 볼 수 있는 난이도 '쉬움 (Easy)' 단계인 "Find Closest Number to Zero" 문제입니다.

--> https://leetcode.com/problems/find-closest-number-to-zero/description/

 

문제 : 

Given an integer array nums of size n, return the number with the value closest to 0 in nums.

If there are multiple answers, return the number with the largest value.


Example 1 :

Input : nums = [-4,-2,1,4,8]

Output : 1

Explanation : The distance from -4 to 0 is |-4| = 4. The distance from -2 to 0 is |-2| = 2. The distance from 1 to 0 is |1| = 1. The distance from 4 to 0 is |4| = 4. The distance from 8 to 0 is |8| = 8. Thus, the closest number to 0 in the array is 1.

 

Example 2 :

Input : nums = [2,-1,1]

Output : 1

Explanation : 1 and -1 are both the closest numbers to 0, so 1 being larger is returned.

 

Constraints :

  • 1 <= n <= 1000
  • -10^5 <= nums[i] <= 10^5

이 문제는 주어진 정수 배열 nums에서 0에 가장 가까운 값을 찾아 반환하는 문제입니다. 여러 개의 값이 0에 같은 거리를 가진다면, 그중 가장 큰 값을 반환해야 합니다.

 

class Solution {
    public int findClosestNumber(int[] nums) {
        int closest = nums[0];

        for (int num : nums) {
            if (Math.abs(num) < Math.abs(closest) || (Math.abs(num) == Math.abs(closest) && num > closest)) {
                closest = num;
            }
        }

        return closest;
    }
}

 

저는 되게 간단한 코드를 짜봤는데요, 이런 거리 문제는 대부분 절대값이 중요합니다. 그래서 제 코드를 보시면, 주어진 정수 배열 nums에서 0에 가장 가까운 값을 찾는 문제를 해결합니다. 만약 여러 개의 값이 0에 같은 거리를 가진다면, 그중 가장 큰 값을 반환합니다.

  1. 변수 초기화 :
    • closest 변수를 배열의 첫 번째 값으로 초기화합니다.
    • 이는 현재까지 발견한 0에 가장 가까운 값을 저장하는 데 사용됩니다.
  2. 배열 순회 :
    • 배열 nums를 순회하면서 각 숫자 num에 대해 절대값을 계산합니다.
    • 현재 숫자 num의 절대값이 closest의 절댓값보다 작거나, 절댓값이 같지만 num이 더 큰 경우 closest를 num으로 업데이트합니다.
  3. 결과 반환 :
    • 배열의 모든 요소를 검사한 후 closest 값을 반환합니다.
  • 시간 복잡도 : O(n)
    • 배열 nums의 길이를 n이라고 할 때, 배열의 각 요소를 한 번씩 검사하므로 시간 복잡도는 O(n)입니다.
  • 공간 복잡도 : O(1)
    • 추가적인 배열이나 리스트를 사용하지 않고, 상수 공간만 사용하므로 공간 복잡도는 O(1)입니다.

나름 퍼포먼스가 좋은 코드라고 생각됐는데 막상 SUbmission 버튼을 누르고 난 뒤 결과가 그리 좋지 못하여서 뭐가 문제일까 하고 고민해 봤습니다. 


 

class Solution {
    public int findClosestNumber(int[] nums) {
       int closest = nums[0];
        
            for (int j = 1; j < nums.length; j++) {

                if (Math.abs(closest) == (nums[j])){
                    closest = nums[j];
                }
                if(Math.abs(nums[j]) < Math.abs(closest)){
                    closest = nums[j];
                }
            }
        return closest;
    }
}

 

그리하여, 저는 코드를 이렇게 변형시켜봤습니다. 사실상 그리 바뀐 건 없고, 더 명확한 조건 분기를 하여 처리했죠. 쉽게 말하자면, closest와 nums[j]의 절댓값이 같은 경우와 nums[j]의 절댓값이 더 작은 경우를 명확히 구분합니다.

 

이는 코드의 가독성을 높이고, 두 조건이 서로 충돌하지 않도록 합니다.

 

시간 복잡도와 공간 복잡도는 그대로인 조금 더 가독성이 높여지고 조건 로직이 명확해진 효율적인 코드로 개선했습니다.


 

개선 되기 전 후 코드 Runtime 결과