코틀린/코딩테스트

코딩테스트 [문자열 뒤집기]

정혜현 2024. 6. 26. 10:32

문제

문자열 my_string이 매개변수로 주어집니다. my_string을 거꾸로 뒤집은 문자열을 return하도록 solution 함수를 완성해주세요.

 


 

풀이

1. 접근

1.1 관찰

문자열을 거꾸로 반환하는 문제

입력 : 문자열 

출력 : 문자열

 

1.2 계획 

뒤집어주는 메소드가 있을 것 같아 찾아봤다.

public inline fun String.reversed(): String {
    return (this as CharSequence).reversed().toString()
}

 

reversed() : 역순 문자열로 반환해주는 메소드

reverse()라는 메소드도 있는데 배열에서 사용하는 메소드이니 주의

 

 

 

 

 

2. 시행착오

2.1 시도

 

class Solution {
    fun solution(my_string: String): String = my_string.reversed()
}

 

검증결과 : 성공

 

메소드를 쓰지 않고 구현하고 싶어서 찾아보다가 문법책으로 공부했던 문자열의 + 연산자와 관련된 방법이 나왔다. 

class Solution {
    fun solution(my_string: String): String {
        var answer: String = ""
        for (i in my_string.indices) {
            answer = my_string[i] + answer
        }
        return answer
    }
}

 

 

abc

a +    = a 

b + a = ba

c + ba = cba (최종 주소값. 위에 객체들은 미아객체가 된다.)

 

참조변수인 String형의 객체는 불변객체다. 왼쪽 문자열 뒤에 오른쪽 문자열을 그대로 붙여 새로운 Heap영역에 만들고 주소값을 반환하게 된다. 이 방법은 문자열의 길이가 길 경우 미아 객체가 많아지므로 성능을 저하시킬 수 있다. 

 

String의 미아객체 문제를 해결할 수 있는 방법으로 StringBuilder라는 클래스가 있다. 이 클래스 생성자를 호출해 문자열 객체를 생성하면 해당 문자열에 연산할 때 주소값을 변경하는 게 아니라 값 자체를 수정해줘서 메모리 관리에 효율적이다. 클래스타입이므로 원본과 타입이 다르다는 점을 주의해야 한다. 

class Solution {
    fun solution(my_string: String): String {
        val answer = StringBuilder(my_string).reverse()
        return answer.toString()
    }
}

 

insert()는 (인덱스번호, 값)으로 해당 인덱스 번호에 값을 삽입하는 메소드. 0번째 인덱스를 고정해두고 반복문으로 값을 넣는 방법이다. 

class Solution {
    fun solution(my_string: String): String {
        val answer = StringBuilder()
        for (i in my_string.indices) {
            answer.insert(0, my_string[i])
        }
        return answer.toString()
    }
}

 

StringBuilder외에 StringBuffer도 있어서 셋의 차이를 정리했다. 

 

StringBuilder

가변객체이므로 값을 변경해야 할 때 사용. 멀티스레드 동시접근이 가능

 

StringBuffer

가변객체이므로 값을 변경해야 할 때 사용. 멀티스레드 동시접근을 막아 안전하나 접근제어 비용 발생

 

String

불변객체이므로 값을 변경하지 않을 때 사용. 멀티스레드 환경에서 안전

 

 

 

 

 

마지막으로 인덱스 마지막 번호에서부터 내려오면서 담는 방법이다. lastIndex로 썼는데 length -1 도 동일하다.

class Solution {
    fun solution(my_string: String): String {
        var answer: String = ""
        for (i in my_string.lastIndex downTo 0) {
            answer += my_string[i]
        }
        return answer
    }
}

 

 

 

 

 


회고

 

 

팀원분들 높은 난이도의 코딩테스트 문제 푸는 걸 보면 시간과 비용을 고려해야되는구나를 어깨너머로 보곤 했다. 지금의 나는 해결방안을 찾는 것만으로도 급급하지만 미리 습관화하는 게 좋겠다. 

 

메모리 영역을 어떻게 쓰고 있는지 알면서 공부하면 좀 더 이해가 잘 된다. String에 대한 도식이 계속 확장 및 수정되고 있는데 지식을 단계별로 쌓아가는 게 재밌다. 내가 배운 또는 내가 배울 모든 것들이 얼마나 더 많은 깊이와 넓이를 가지고 있을지 기대해보며 함부로 판단하지 말아야겠다고 느낀 회차.