java StringBuilder에서 revers()는 어떻게 작동할까? - 문자열 뒤집기

사당동씩씩이·2024년 4월 17일

프로그래머스 문자열 여러번 뒤집기 풀고 다른 사람들의 코드를 살펴보면,
java에서 문자열 뒤집기는 크게 3가지 유형이 있다.
물론 세부적으로 살펴보면 크게 포인터를 1개사용하였는가 2개사용하였는가 였다.

그중 java에서 java.lang에 포함된 StringBuffer와 StringBuilder는 기본적인 문자열을 다를 수 있도록 제공되는데 이 class들은 어떻게 문자열을 뒤집는지 궁금해졌다.

문자열을 뒤집는 방법

방법1. (내가사용한 방법) 문자열 배열(char[])를 stack을 활용해 뒤집었다.
방법2. 2포인터를 사용해서 주어진 시작과 끝을 서로 바꾸며 한칸식 이동하며, 포인터가 만나면 종료된다.
방법3. StrignBuilder나 StringBuffer에서 제공하는 revers()를 호출한다.

revers()는 어떻게 문자열을 뒤집을까?

  • 결론부터 이야기하면 두개의 포인터로 첫자리와 끝자리부터 시작하여 서로 바꾸며, 포인터가 만나면 반복을 중단하고 리턴한다.
  • StringBuffer와 StringBuilder 모두 AbstractStringBuilder의 자식 class이며, super.revers()를 호출한다.
public AbstractStringBuilder reverse() {
        byte[] val = this.value;
        int count = this.count;
        int n = count - 1;
        if (isLatin1()) {
            for (int j = (n-1) >> 1; j >= 0; j--) {
                int k = n - j;
                byte cj = val[j];
                val[j] = val[k];
                val[k] = cj;
            }
        } else {
            StringUTF16.reverse(val, count);
        }
        return this;
    }
  • count는 사용된 문자의 갯수 : 우리가 흔히 length()로 호출되는 수이고 -1을 하여 index로 바로 사용할 수 있다.
  • n-1 >> 2로 시작index를 지정하게 된다. 중간부터 대칭으로 교환하게 됨으로. 포인터는j와 k이다.
  • 10개의 문자인 경우 index는 0~9이 되어 n=9로 지정되며, 최대 index인 9-1/2인 4부터 감소하며 대칭 index인 9-4(n-j) 5와 교환된다.
profile
N잡러 대충 이것저것 해보며 대충 사는 중

0개의 댓글