Skip to main content

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의 길이

정답코드

  1. StringBuilder result → 최종 결과를 담을 빌더
  2. StringBuilder mid → 잘라낸 부분을 담고 뒤집을 빌더
  3. 다음을 순서대로 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() 메서드가 없기 때문에, 문자열을 뒤집으려면 StringBuilderStringBuffer를 사용해야 한다.
  • 메서드명: 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();
    }
}

image.png

StringBuilder를 하나 더 선언해서 잘라낸 부분만 뒤집고, 해당 StringBuilder을 return 한 StringBuilder에 추가할 수 있도록 한다. 이 때 주의할 점은 e 이후 뒷부분을 추가할 때 인덱스가 e가 아니라 e + 1부터 시작이라는 점이다. e는 이미 reverse 대상에 포함되어 mid에 한 번 들어갔기 때문에 그 이후 문자열부터 추가해서 해결 해 주었다.