문자열을 뒤집는 방법에는 다음과 같은 방법이 있다.

  • 전부 뒤집기
  • 부분 뒤집기

String은 immutable(불변)하다는 특징이 있다. 스트링을 더하거나 바꿔주거나 할 때는 무조건 새로운 String이 생성된다.

a+b를 콘솔에 찍어보면 Hello World!가 나온다고 해서 단순히 '아, Hello라는 문자열에 World를 더해주었구나' 라고 생각해서는 안된다.

찍어본 HashCode

위의 결과에서 알 수 있듯, a, b, a+b의 hashcode는 다르다. a에다가 b를 붙여준 것이 아니라, "Hello World"라는 스트링을 생성해준 것이다. String을 리터럴로(""의 형태로) 한번 생성하면 Heap 영역에 있는 Constant String Pool에서 같은 String이 있는지 검사한 후, 같은 스트링이 없다면 스트링 풀에 문자열 객체를 생성하고 주소값을 반환한다. 이와 같은 맥락에서 String에서의 equals와 ==의 차이 문제가 발생하기도 한다. 자세한 내용은 나중에 따로 설명하겠다.

 

그렇다면 스트링을 이용하고 싶은데 메모리를 덜 먹는 방법은 없을까?

바로 StringBuilder 클래스를 이용하는 것이다. StringBuffer 클래스도 있지만 이것은 동기화 차이이므로 Builder 클래스가 낫다.

for (String x : str){
	StringBuilder sb = new StringBuilder();
	answer.add(String.valueOf(sb.append(x).reverse()));
}

스트링빌더는 한번 생성한 개체로 필드의 가변 인자들을 받아 append등의 연산을 빠르고 가볍게 할 수 있다.

조금 더 풀이를 깎아서,

for (String x : str){
	String tmp = new StringBuilder(x).reverse();
	answer.add(tmp)
}

로도 나타낼 수 있겠다. 조금 더 명확하다.

 

toCharArray를 이용해서 문자열을 부분적으로 뒤집는 방법도 있다.

for (String x : str){
	char[] arr = x.toCharArray();
	int lt = 0;
	int rt = arr.length-1;
	while (lt<rt){
		char tmp = arr[lt];
		arr[lt] = arr[rt];
		arr[rt] = tmp;
        lt++;
        rt--;
        }
        answer.add(String.valueOf(arr));
}

기술 자체는 어려운게 아니지만, lt와 rt를 설정하는 방법이 핵심이다.

 

lt는 한 칸씩 증가, rt는 한 칸씩 감소하면서 char배열을 읽어낼 수 있다.

마지막에 String.valueOf로 값을 뽑아준다.

 

 

 

 

https://hyeran-story.tistory.com/123#recentEntries

 

[Java] equals()과 == 차이점, String Constant Pool(상수 풀)

자바에서 String의 값을 비교할때 equals()를 쓰시나요 ==을 쓰시나요? 보통 산술연산자에서 값을 비교할때는 ==을 하는데요 인텔리제이에서 String의 값을 비교할때 ==을 쓰면 아래와 같은 메세지를

hyeran-story.tistory.com

 

'알고리즘 > 기타' 카테고리의 다른 글

Two pointers  (0) 2023.04.25
[JAVA]지뢰 찾기 - 델타 배열을 이용한 방법  (0) 2023.02.02
소수 찾기 - 외부 메서드 없이 탐색  (0) 2023.02.02
문자열 중복제거 - indexOf()  (0) 2023.01.29

+ Recent posts