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에 같은 거리를 가진다면, 그중 가장 큰 값을 반환합니다.
- 변수 초기화 :
- closest 변수를 배열의 첫 번째 값으로 초기화합니다.
- 이는 현재까지 발견한 0에 가장 가까운 값을 저장하는 데 사용됩니다.
- 배열 순회 :
- 배열 nums를 순회하면서 각 숫자 num에 대해 절대값을 계산합니다.
- 현재 숫자 num의 절대값이 closest의 절댓값보다 작거나, 절댓값이 같지만 num이 더 큰 경우 closest를 num으로 업데이트합니다.
- 결과 반환 :
- 배열의 모든 요소를 검사한 후 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]의 절댓값이 더 작은 경우를 명확히 구분합니다.
이는 코드의 가독성을 높이고, 두 조건이 서로 충돌하지 않도록 합니다.
시간 복잡도와 공간 복잡도는 그대로인 조금 더 가독성이 높여지고 조건 로직이 명확해진 효율적인 코드로 개선했습니다.
'LeetCode' 카테고리의 다른 글
[LeetCode] - 2129. Capitalize the Title (0) | 2024.07.31 |
---|---|
[LeetCode] - 2169. Count Operations to Obtain Zero (0) | 2024.07.31 |
[LeetCode] - 1796. Second Largest Digit in a String (0) | 2024.07.31 |
[LeetCode] - 1790. Check if One String Swap can Make Strings Equal (0) | 2024.07.31 |
[LeetCode] - 1646. Get Maximum in Generated Array (0) | 2024.07.31 |