1. 문제(원본)
Given a string S that only contains "I" (increase) or "D" (decrease), let N = S.length.
Return any permutation A of [0, 1, ..., N] such that for all i = 0, ..., N-1:
- If S[i] == "I", then A[i] < A[i+1]
- If S[i] == "D", then A[i] > A[i+1]
Example 1:
Input: "IDID" Output: [0,4,1,3,2]
Example 2:
Input: "III" Output: [0,1,2,3]
Example 3:
Input: "DDI" Output: [3,2,0,1]
Note:
- 1 <= S.length <= 10000
- S only contains characters "I" or "D".
2. 문제
"I" 와 "D" 를 입력하여 입력한 문자열의 수 + 1 의 0부터 시작하는 Int형 배열을 반환하라
"I" 일 경우 순차적으로 대입, "D" 일 경우는 역순으로 대입하라
3. 나의 답
class Solution {
func diStringMatch(_ S: String) -> [Int] {
var result: [Int] = [Int](repeating: 0, count: S.count + 1)
var startIndex = 0
var endIndex = S.count
for (index, element) in S.enumerated() {
switch element {
case "I":
result[index] = startIndex
startIndex += 1
default:
result[index] = endIndex
endIndex -= 1
}
}
result[S.count] = startIndex
return result
}
}
4. 다른 유저의 답
#1
class Solution {
func diStringMatch(_ S: String) -> [Int] {
var res:[Int] = [Int](repeating: 0, count:S.count + 1)
var min = 0
var max = S.count
var arr = Array(S)
for i in 0..<S.count {
if arr[i] == "I"{
res[i] = min
min = min + 1
}else{
res[i] = max
max = max - 1
}
}
res[S.count] = min
return res
}
}
#2
class Solution {
func diStringMatch(_ S: String) -> [Int] {
var low = 0
var high = S.count
var result = [Int]()
for char in S{
if char == "I"{
result.append(low)
low += 1
}
else{
// char == "D"
result.append(high)
high -= 1
}
}
result.append(high)
return result
}
}
5. 마무리
다른 유저들의 답도 거의 비슷하게 푼 것 같다. 아예 똑같은 방법인 유저도 있었다. 한 가지 아쉬운 것은 이것 또한 메모리 관련된 문제였기 때문에 수가 커질 수록 메모리에 부담이 있었다.
'알고리즘 > 해결' 카테고리의 다른 글
LeetCode344. Reverse String (0) | 2020.03.31 |
---|---|
LeetCode557. Reverse Words in a String III (0) | 2020.03.31 |
LeetCode561. Array Partition I (0) | 2020.03.25 |
LeetCode1051. Height Checker (0) | 2020.03.25 |
LeetCode728. Self Dividing Numbers (0) | 2020.03.25 |