Dev/Algorithm

간만의 알고리즘 공부 - 16 (핸드폰 번호 가리기)

healthyryu 2024. 7. 16. 21:25
문제 설명
프로그래머스 모바일은 개인정보 보호를 위해 고지서를 보낼 때 고객들의 전화번호의 일부를 가립니다.전화번호가 문자열 phone_number로 주어졌을 때, 전화번호의 뒷 4자리를 제외한 나머지 숫자를 전부 *으로 가린 문자열을 리턴하는 함수, solution을 완성해주세요.

제한 조건
- phone_number는 길이 4 이상, 20이하인 문자열입니다.

 

입출력 예

 

 

내가 푼 방법

fun solution(phone_number: String): String {
    val hiddenPosition = phone_number.length - 4
    return phone_number.mapIndexed { index, number -> if (index<hiddenPosition) "*" else number}.joinToString("")
}

 

큰 고민없이 풀었더니 점수가 낮았고 역시 시간이 많이 걸렸습니다.

 

 

 

다른 사람이 푼 코드도 참고하고 몇가지 첨삭 코드를 테스트해봤는데 크게 효율적이지 않았고 마지막으로 코드첨삭을 받아봤을때 StringBuilder() 를 사용해봤다. 그리고 확연히 테스트를 진행했을때 줄어든 시간을 확인했다. 코드는 조금 더 길어지지만, 시간은 100배 이상 차이 났다.

 

코드 첨삭

fun solution(phone_number: String): String {
    val hiddenPosition = phone_number.length - 4
    val result = StringBuilder()

    for (i in 0 until hiddenPosition) {
        result.append('*')
    }

    for (i in hiddenPosition until phone_number.length) {
        result.append(phone_number[i])
    }

    return result.toString()
}

 

StringBuilder 가 문자열을 새성하는데 매우 효율적임을 이제(?) or 다시(?) 알게되었습니다. 물론 과거게 알았을수도 있지만 지금 머릿속에 관련 지식이 없습니다.

 

 

StringBuilder

- 장) 가변 길이의 문자열을 생성하기 위해 내부적으로 배열을 사용.

- 장) 즉 문자열 변경 할때, 새로운 메모리 할당을 반복적으로 하지 않아도 된다는 것

- 단) String 클래스는 불변(immutable)이라 문자열을 변경할 때마다 새로운 문자열 객체를 생성

- 단) 메모리 사용량이 증가 GC(Garbage Collection)가 자주 발생

반응형