[자바알고리즘] 문자열 내림차순으로 배치하기
Q. 문자열 s에 나타나는 문자를 큰것부터 작은 순으로 정렬해 새로운 문자열을 리턴하는 함수, solution을 완성해주세요.
s는 영문 대소문자로만 구성되어 있으며, 대문자는 소문자보다 작은 것으로 간주합니다.
str은 길이 1 이상인 문자열입니다.
예시) "Zbcdefg" -> return "gfedcbZ"
import java.util.*;
class Solution {
public String solution(String s) {
String answer = "";
String[] str = s.split("");
Arrays.sort(str, Collections.reverseOrder());
for(String a : str)
answer += a;
return answer;
}
}
구글링해서 이렇게 따라 작성하다가 스트링빌더 사용해보고 싶어서 다시 작성했다.
import java.util.Arrays;
class Solution {
public String solution(String s) {
char [] aa = s.toCharArray();
Arrays.sort(aa);
StringBuilder answer = new StringBuilder(String.valueOf(aa));
answer.reverse();
return answer.toString();
}
}
이걸 풀기 위해 공부한 StringBuilder와 StringBuffer.
Java에서 String 객체는 한번 값이 할당되면 그 공간은 변하지 않는다.(불변성)
하지만 Stringbuilder나 StringBuffer 객체는 한번 값이 할당되더라도 한번 더 다른 값이 할당되면 할당된 공간이 변하는 특성을 갖고 있다.(가변성)
StringBuilder , StringBuffer에 문자열을 추가하게 되면 추가할 문자열의 크기(길이)만큼 현재의 문자열을 저장하는 배열의 공간을 늘려주고, 늘려준 공간에 추가할 문자열을 넣어주는 방식으로 되어있다.
하지만 두 클래스의 기능은 동일하지만 한 가지 차이점이 있다.
바로 동기화(Synchronization)에서의 차이점.
StringBuilder는 동기화를 지원하지 않는 반면, StringBuffer는 동기화를 지원하여 멀티 스레드 환경에서도 안전하게 동작할 수 있. StringBuilder는 동기화를 지원하지 않는 반면, 속도면에선 StringBuffer 보다 성능이 좋다.
(StringBuffer 또한 동일함)
.append( ) : StringBuffer 인스턴스가 저장하고 있는 문자열 뒤에 덧붙인다
.delete(int start, int end) : 시작위치(start) 부터 끝 위치(end) 사이에 있는 문자를 제거한다 (단, 끝 위치의 문자는 제외!)
.deleteCharAt(int index) : 지정된 위치(index)의 문자를 제거한다.
.insert(int pos, String str) : 두번째 매개변수로 받은 값을 문자열로 변환하여 지정된 위치(pos)에 추가한다. (pos는 0부터 시작)
.replace(int start, int end, string str) : 지정된 범위(start ~ end)의 문자들을 주어진 문자열로 바꾼다. (end 위치의 문자는 범위에 포함 되지않는다!)
.reverse( ) : 문자열의 순서를 거꾸로 나열한다.
.setCharAt(int index, char ch) : 지정된 위치의 문자를 주어진 문자(ch)로 바꾼다
.toString( ) : StringBuffer 인스턴스의 문자열을 String으로 반환한다.
.subString(int start) or .subString(int start, int end)
: 지정된 범위 내의 문자열을 String으로 뽑아서 반환한다.
변하지 않는 문자열을 자주 사용할 경우 String 타입을 사용하는 것이 성능면에서 유리!
단일 스레드 환경 과 문자열의 추가, 수정, 삭제 등이 빈번히 발생하는 경우 StringBuilder를 사용하는 것이 성능면에서 유리!
멀티 스레드 환경 과 문자열의 추가, 수정, 삭제 등이 빈번히 발생하는 경우 StringBuffer를 사용하는 것이 성능면에서 유리!
📍 참고 자료
https://velog.io/@jmjgirl/JAVA-%EB%AC%B8%EC%9E%90%EC%97%B4-%EB%92%A4%EC%A7%91%EA%B8%B0-reverse
https://velog.io/@heoseungyeon/StringBuilder%EC%99%80-StringBuffer%EB%8A%94-%EB%AC%B4%EC%8A%A8-%EC%B0%A8%EC%9D%B4%EA%B0%80-%EC%9E%88%EB%8A%94%EA%B0%80