문제
You are given a sorted unique integer array nums.
A range [a,b] is the set of all integers from a to b (inclusive).
Return the smallest sorted list of ranges that cover all the numbers in the array exactly. That is, each element of nums is covered by exactly one of the ranges, and there is no integer x such that x is in one of the ranges but not in nums.
Each range [a,b] in the list should be output as:
- "a->b" if a != b
- "a" if a == b
Example 1:
Input: nums = [0,1,2,4,5,7]
Output: ["0->2","4->5","7"]
Explanation: The ranges are:
[0,2] --> "0->2"
[4,5] --> "4->5"
[7,7] --> "7"
Example 2:
Input: nums = [0,2,3,4,6,8,9]
Output: ["0","2->4","6","8->9"]
Explanation: The ranges are:
[0,0] --> "0"
[2,4] --> "2->4"
[6,6] --> "6"
[8,9] --> "8->9"
Constraints:
- 0 <= nums.length <= 20
- 231 <= nums[i] <= 231 - 1
- All the values of nums are unique.
- nums is sorted in ascending order.
풀이
나의 풀이법
풀이 접근 과정
숫자가 증가하는지를 판단하여 증가할 때와 증가하지 않을 때를 구분하여 작업하면 되겠다고 생각했다.
처음엔 first, end로 접근하다가 오히려 더 복잡해질 것 같아서 first 하나만 잡고 진행했다.
최종 소스코드
class Solution {
fun summaryRanges(nums: IntArray): List<String> {
val answer = arrayListOf<String>()
var first = 0
for (i in 0 until nums.size) {
if (i == 0) {
first = nums[0]
} else if (nums[i] != nums[i-1]+1) {
if (first != nums[i-1]) {
answer.add("$first->${nums[i-1]}")
} else {
answer.add("$first")
}
first = nums[i]
}
if (i == nums.size-1) {
if (first != nums[i]) answer.add("$first->${nums[i]}")
else answer.add("$first")
}
}
return answer
}
}
처음 값을 잡고 앞 값과 1이 차이나지 않을 때를 계산한다.
nums가 비어있을 때의 예외처리를 위해 i==0의 조건을 추가하였다.
내 방법에서는 마지막 값에서 input 처리가 안되므로 마지막 index일 때의 조건도 추가하였다.
다른 풀이법
fun summaryRanges(nums: IntArray): List<String> {
val result = mutableListOf<String>()
if (nums.isEmpty()) return result
var start = nums[0]
var end = nums[0]
for (i in 1 until nums.size) {
if (nums[i] == end + 1) {
end = nums[i]
} else {
if (start == end) {
result.add(start.toString())
} else {
result.add("$start->$end")
}
start = nums[i]
end = nums[i]
}
}
if (start == end) {
result.add(start.toString())
} else {
result.add("$start->$end")
}
return result
}
내 코드와 효율성 차이는 크게 없다.
내가 처음 접근했던 start,end를 사용한 풀이이다.
Comment
if문을 너무 더럽게 쓴 것 같아서 아쉬운 코드이다… 허규귱 😭😭
'LeetCode > Kotlin | Easy' 카테고리의 다른 글
[LeetCode/Kotlin]Easy - 1. Two Sum (0) | 2023.10.13 |
---|---|
[LeetCode/Kotlin]Easy - 506. Relative Ranks (0) | 2023.09.19 |
[LeetCode/Kotlin]Easy - 704. Binary Search (0) | 2023.09.19 |
[LeetCode/Kotlin]Easy - 463. Island Perimeter (0) | 2023.09.14 |
[LeetCode/Kotlin]Easy - 345. Reverse Vowels of a String (0) | 2023.09.14 |