문제
문자열에 들어았는 모든 공백을 %20으로 바꾸기. %20으로 바꾸었을 때만큼의 크기를 가진 문자열(String 혹은 CharArray)과, 실제 문자열의 크기(size)가 주어진다.
문제 풀기 전 확인 사항
1. input은 String인가 아니면 CharArray인가?
문제 풀이1
input이 String이라고 가정하면, 아래와 같이 풀 수 있다. Kotlin의 String은 Immutable 하기 때문에, String에서 CharArray를 가져오려면 새로운 CharArray를 할당해야 하므로 아래와 같이 새로운 공간을 할당해야 한다.
class Solution() {
fun urlify(input: String, size: Int): String {
var charArrayIndex = 0
val charArray = CharArray(input.length)
var index = 0
for (char in input) {
if (index == size) break
if (char == ' ') {
charArray[charArrayIndex] = '%'
charArray[charArrayIndex + 1] = '2'
charArray[charArrayIndex + 2] = '0'
charArrayIndex += 3
} else {
charArray[charArrayIndex] = char
charArrayIndex += 1
}
index += 1
}
return String(charArray)
}
}
복잡도
size가 N이라 했을 때
시간 복잡도: O(N) - 한 번만 for문을 돌면 되므로
공간 복잡도: O(N) - 최대 3N만큼의 공간이 생성되므로
문제 풀이2
input이 CharArray라고 한다면, 아래와 같이 풀 수 있다. 실제 문자 크기인 size를 사용해 CharArray에서 마지막 문자열부터 하나씩 처리해서 채워나가는 방식으로 처리한다.
class Solution2() {
fun urlify(input: CharArray, size: Int): CharArray {
var currentIdx = input.size - 1
for (index in size - 1 downTo 0) {
val value = input[index]
if (value == ' ') {
input[currentIdx] = '0'
input[currentIdx - 1] = '2'
input[currentIdx - 2] = '%'
currentIdx -= 3
} else {
input[currentIdx] = value
currentIdx -= 1
}
}
return input
}
}
복잡도
size가 N이라 했을 때
시간 복잡도: O(N) - 한 번만 for문을 돌면 되므로
공간 복잡도: O(1) - 추가 공간을 사용하지 않았으므로
테스트 케이스
- 양쪽에 문자가 있는 케이스
- 모두 공백인 케이스
- 한쪽만 공백인 케이스
fun main() {
val solution = Solution2()
println(solution.urlify("Mr Dev Cho ".toCharArray(), 10))
println(solution.urlify(" ".toCharArray(), 3))
println(solution.urlify("A ".toCharArray(), 2))
}
반응형
'알고리즘 > 알고리즘' 카테고리의 다른 글
[Kotlin] Matrix 90도 회전시키기 : Matrix Rotation (0) | 2023.05.27 |
---|---|
[Kotlin] String 압축하기 : 반복되는 문자 압축하기 (0) | 2023.05.26 |
[Kotlin] 두개의 String이 있다고 했을 때, 하나의 String에 대해 문자를 하나 이하로 추가하거나 지우거나 다른 값으로 바꾸었을 때 동일한지 확인 (0) | 2023.05.25 |
[Kotlin] String이 Palindrome Permutation인지 확인하기 (0) | 2023.05.24 |
[Kotlin] 중복 문자열 확인 알고리즘 (0) | 2023.05.21 |