다음 숫자와 차이가 1보다 크면 같은 범위에 속한 숫자가 아니게 된다.
포인터를 두고 확장해 나가며 범위를 구해 정답에 추가하자.
class Solution {
public List<String> summaryRanges(int[] nums) {
if (nums.length == 0) {
return List.of();
}
List<String> result = new ArrayList<>();
int s = 0;
int prev = nums[s];
int e;
for (e = 0; e < nums.length; e++) {
if (Math.abs(nums[e] - prev) > 1) {
// 범위를 벗어난 상태 s부터 e-1까지 유효 범위
if (s != e - 1) {
result.add(nums[s] + "->" + nums[e - 1]);
} else {
result.add(String.valueOf(nums[s]));
}
s = e;
}
prev = nums[e];
}
if (s == e - 1) {
result.add(String.valueOf(nums[s]));
} else {
result.add(nums[s] + "->" + nums[e - 1]);
}
return result;
}
}
여기서 주의해야 할 점은 크기 비교 부분이다.
nums[e] - prev > 1 이렇게 판정을 할 시 배열의 값이 int 범위이므로 오버플로우가 발생할 수 있다.
예를 들어 2147483647와 -2147483647를 보면 알 수 있다.
2147483647 - (-2147483647)를 하면 오버플로우로 순환이 발생해 -2가 반환값으로 나오게 된다.
이를 해결하기 위해 거리개념을 도입하기 위해 Math.abs를 사용했다. 아니면 오버플로우를 방지하기 위해 long으로 변환해 계산해도 된다.
'Algorithm > LeetCode' 카테고리의 다른 글
LeetCode 199 - Binary Tree Right Side View (0) | 2024.10.15 |
---|---|
LeetCode 530 - Minimum Absolute Difference in BST (0) | 2024.10.15 |
LeetCode 36 - Valid Sudoku (0) | 2024.10.14 |
LeetCode 30 - Substring with Concatenation of All Words (1) | 2024.10.08 |
LeetCode 3 - Longest Substring Without Repeating Characters (0) | 2024.10.07 |