21. [Java] 문자열 뒤집기
https://school.programmers.co.kr/learn/courses/30/lessons/181905
- my_string과 정수 s, e
- my_string에서 인덱스 s부터 인덱스 e까지를 뒤집은 문자열 return
- my_string은 숫자와 알파벳으로만 이루어져 있다.
- 1 ≤ my_string의 길이 ≤ 1,000
- 0 ≤ s ≤ e < my_string의 길이
정답코드
StringBuilder result
→ 최종 결과를 담을 빌더StringBuilder mid
→ 잘라낸 부분을 담고 뒤집을 빌더- 다음을 순서대로
result
에 append:my_string.substring(0, s)
→ 앞 부분new StringBuilder(my_string.substring(s, e + 1)).reverse()
→ 뒤집힌 중간 부분my_string.substring(e + 1)
→ 뒷 부분
class Solution {
public String solution(String my_string, int s, int e) {
StringBuilder sb = new StringBuilder();
// s 이전 문자들 추가
sb.append(my_string.substring(0, s));
// s-e까지 문자열 뒤집기
StringBuilder mid = new StringBuilder(my_string.substring(s, e+1));
mid.reverse();
sb.append(mid);
// e 이후 뒷부분 그대로 추가
sb.append(my_string.substring(e + 1));
return sb.toString();
}
}
- String str = my_string.substring(s, e + 1)
→ s에서 e까지 잘라내려면 끝 인덱스가 e+1 여야 한다. 왜냐하면 마지막 인덱스는 포함 하지 않기 때문이다. - sb.append(my_string.substring(e + 1))
→ s에서 e까지 잘라내려면 끝 인덱스가 e+1 여야 한다. 왜냐하면 뒤집는 부분에서 이미 e번 인덱스까지 포함되었기 때문이다.
✅ StringBuilder.reverse()
String
클래스에는reverse()
메서드가 없기 때문에, 문자열을 뒤집으려면StringBuilder
나StringBuffer
를 사용해야 한다.- 메서드명:
reverse()
- 클래스:
java.lang.StringBuilder
- 원본
StringBuilder
를 직접 수정(mutable)하기 때문에 호출 후sb
에 저장된 문자열 자체가 뒤집혀 변경된다. - 반환값: 자신(
this
)을 반환하기 때문에 메서드 체이닝이 가능하다.sb.reverse().append("!!!")
처럼 이어서 쓸 수 있음
- 뒤집은 결과를 다시
String
으로 얻으려면toString()
호출이 필요하다.
StringBuilder sb = new StringBuilder("HelloWorld");
sb.reverse();
System.out.println(sb.toString()); // 출력: dlroWolleH
✅ StringBuilder 생성 + 잘라낸 문자열 담기
StringBuilder mid = new StringBuilder(my_string.substring(s, e+1));
오답
s이전 문자들을 먼저 StringBuilder에 추가하고, s부터 e까지의 문자를 잘라 추가한 뒤 reverse() 시켰으나 s이전의 문자까지 같이 뒤집혀서 원하는 결과가 나오지 않음.
class Solution {
public String solution(String my_string, int s, int e) {
StringBuilder sb = new StringBuilder();
// s 이전 문자들 추가
sb.append(my_string.substring(0, s));
// substring으로 잘라낸 다음
sb.append(my_string.substring(s, e + 1));
// StringBuilder의 reverse() 메서드로 뒤집기
sb.reverse();
// e 이후 문자들 추가
sb.append(my_string.substring(e));
return sb.toString();
}
}
StringBuilder를 하나 더 선언해서 잘라낸 부분만 뒤집고, 해당 StringBuilder을 return 한 StringBuilder에 추가할 수 있도록 한다. 이 때 주의할 점은 e 이후 뒷부분을 추가할 때 인덱스가 e가 아니라 e + 1부터 시작이라는 점이다. e는 이미 reverse 대상에 포함되어 mid에 한 번 들어갔기 때문에 그 이후 문자열부터 추가해서 해결 해 주었다.