알고리즘/알고리즘

[Kotlin] 공백을 "%20"으로 대체해 Url로 만들기

심플코드 2023. 5. 23. 21:39
반응형

문제

문자열에 들어았는 모든 공백을 %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))
}

 

반응형