포스트

2021-01-06-TIL

2020-01-06-TIL

Today I Learned

자바 문자열 뒤집기

Java의 String은 불변 객체라서 문자열 자체를 뒤집는 메서드가 없다. 대신 변경 가능한 문자열 버퍼인 StringBuilder에 담아 reverse()를 부른 뒤 다시 String으로 꺼낸다.

1
2
String s = "hello";
String reversed = new StringBuilder(s).reverse().toString();  // "olleh"

직접 구현한다면 char 배열로 바꾼 뒤 양 끝에서 두 포인터를 안쪽으로 옮기며 맞바꾼다. 길이 n인 문자열에서 n/2번 교환하므로 시간 복잡도는 O(n)이다.

1
2
3
4
5
6
7
char[] chars = s.toCharArray();
for (int i = 0, j = chars.length - 1; i < j; i++, j--) {
    char tmp = chars[i];
    chars[i] = chars[j];
    chars[j] = tmp;
}
String reversed = new String(chars);

두 방법의 차이: 서로게이트 쌍

두 코드는 영어나 한글에서는 같은 결과를 내지만, 이모지 같은 일부 문자에서 달라진다. Java는 문자열을 UTF-16으로 다루고 char 하나는 16비트다. 그래서 코드 포인트가 U+FFFF보다 큰 문자는 char 두 개(서로게이트 쌍)로 표현된다. 위의 직접 구현은 char 단위로 맞바꾸므로 쌍의 순서까지 뒤집혀 깨진 문자가 된다.

StringBuilder.reverse()는 이 경우를 처리한다. Javadoc에 따르면 서로게이트 쌍은 뒤집을 때 하나의 문자로 취급되고, 쌍 안의 high-low 순서는 뒤집히지 않는다. 문제 풀이에서는 입력이 영문이나 숫자로 한정되는 경우가 많아 직접 구현해도 되지만, 실제 사용자 입력을 다룬다면 라이브러리 메서드를 쓰는 편이 안전하다.

참고한 자료외부 출처 2

외부 출처

이 글은 저작권자의 CC BY 4.0 라이선스를 따릅니다.

댓글

아직 댓글이 없습니다