본문 바로가기
코딩테스트 공부/프로그래머스

[Coding Test : Java] Lv.0 : 문자열 반복 출력하기

by 규글 2023. 3. 16.

 문제 상황은 다음과 같다.[각주:1]


 문자열 my_string과 정수 n이 매개변수로 주어질 때, my_string에 들어있는 각 문자를 n만큼 반복한 문자열을 return 하도록 solution 함수를 완성해보세요.


코드

class Solution {
    public String solution(String my_string, int n) {
        String[] strArray = my_string.split("");

        String answer = "";
        
        for(String tmp : strArray){
            for(int i=1; i<=n; i++){
                answer += tmp;
            }
        }

        return answer;
    }
}

 단순하게 생각하면 String을 모두 이어 붙이면 된다. String answer 변수에는 String들이 합쳐진 형태의 값에 대한 참조값이 할당되지만, 각각의 String은 모두 각각의 값을 지니고 heap 영역에 존재하게 된다. 때문에 연산 과정에서 더 많은 메모리를 사용하게 된다. 따라서 String을 이어붙여서 update 할수록 더 많은 메모리를 차지한다.

 

class Solution {
    public String solution(String my_string, int n) {
        String[] strArray = my_string.split("");
        
        StringBuilder sb = new StringBuilder();
        
        for(String tmp : strArray){
            for(int i=1; i<=n; i++){
                sb.append(tmp);
            }
        }
        
        String answer = sb.toString();
        
        return answer;
    }
}

 하지만 StringBuilder는 다르다. 이 친구는 해당 String에 바로 값을 붙여주면서, 공간이 부족한 경우 자동으로 늘어난다고 한다. 따라서 String 각각이 메모리를 차지하지 않을 수 있어서 낭비도 적고, 연산 속도도 빨라진다. 대신 공간을 계속해서 늘려주는 과정이 동반되는 것 때문에 효율이 떨어질 수는 있으나, 필요하다면 애초에 그 크기를 정해서 형성해주면 된다고 한다. 비슷한 친구로 StringBuffer가 있다.[각주:2]

 

 연산 속도를 보면 아주 큰 차이를 보이는 것을 확인할 수 있다.

 

Footnote

댓글