Skip to main content

16 . [Java] 문자열 여러번 뒤집기 - sb.charAt()

https://school.programmers.co.kr/learn/courses/30/lessons/181913

📌 문제

  • 문자열 my_string과 2차원 정수 배열 queries가 주어짐
  • queries의 각 원소 [s, e]my_string인덱스 s부터 e까지 부분 문자열을 뒤집으라는 의미
  • 모든 쿼리를 주어진 순서대로 적용한 뒤의 문자열을 반환

📌 제한사항

  • my_string: 소문자만, 길이 1~1,000
  • queries: 길이 1~1,000
    • 각 원소는 0 ≤ s ≤ e < my_string.length()

코드

  1. 문자열을 StringBuilder로 변환해서 수정 가능하도록 함
  2. [s, e]에 대해 투포인터로 문자열을 뒤집음
  3. 모든 쿼리를 순서대로 적용 후, 최종 문자열을 반환
import java.util.*;

class Solution {
    public String solution(String s) {
        int[] cnt = new int[26];
        
        for(char c : s.toCharArray()) {
            cnt[c - 'a']++;
        }
        
        StringBuilder sb = new StringBuilder();
        for (int i = 0; i < 26; i++) {
            if (cnt[i] == 1) sb.append((char)i+'a');
        }
        return sb.toString(); 
    }
}

위 코드에서 메서드를 따로 분리하면 아래와 같이 재사용성이 높은 코드가 된다.

class Solution {
    public String solution(String my_string, int[][] queries) {
        StringBuilder sb = new StringBuilder(my_string);

        // 각 쿼리에 대해 부분 문자열을 뒤집기
        for (int[] query : queries) {
            int s = query[0];
            int e = query[1];
            reverse(sb, s, e);  // 구간 [s, e]를 뒤집는 메서드 호출
        }

        return sb.toString();
    }

    //특정 구간을 뒤집는 메서드 (swap 반복 사용)
    private void reverse(StringBuilder sb, int start, int end) {
        while (start < end) {
            swap(sb, start, end);  // 두 문자 위치 교환
            start++;
            end--;
        }
    }

    // 두 인덱스의 문자를 교환하는 메서드
    private void swap(StringBuilder sb, int i, int j) {
        char temp = sb.charAt(i);
        sb.setCharAt(i, sb.charAt(j));
        sb.setCharAt(j, temp);
    }
}


오답

처음에는 문자 두 개를 바꾸는 swap() 메서드를 별도로 구현했으나, 이것 만으로는 로직 구현이 어렵다.

private void swap(StringBuilder sb, int i, int j) {
    char temp = sb.charAt(i);
    sb.setCharAt(i, sb.charAt(j));
    sb.setCharAt(j, temp);
}

특정 구간을 뒤집는 reverse() 메서드를 구현해서 시작 범위부터 끝 범위까지 반복되는 작업을 수행할 수 있도록 해야 한다.

private void reverse(StringBuilder sb, int start, int end) {
    while (start < end) {
        swap(sb, start, end); 
        start++;
        end--;
    }
}
  • swap()단일 문자 교환
  • reverse()swap을 여러 번 호출해 부분 문자열 뒤집기
  • solution()queries의 각 구간에 대해 reverse 호출

✅ for (int[] query : queries)
  • for-each문 사용시 앞에 자료형을 int[]로 명시하면 정수형 배열을 순회할 수 있음
✅ sb.setCharAt(i, sb.charAt(j));
  • 이 메서드는 Java에서 StringBuilder 객체 sb의 i번째 문자를 j번째 문자로 바꾸는 코드이다.
sb.setCharAt(i, sb.charAt(j));

메서드 이름

설명

sb.charAt(j)

j번째 문자를 가져옴 (읽기)

sb.setCharAt(i, ...)

i번째 위치에 문자를 덮어씀 (쓰기)

위 메서드의 사용법은 아래와 같다.

StringBuilder sb = new StringBuilder("hello");
sb.setCharAt(1, sb.charAt(4));  // 'e' → 'o'
System.out.println(sb); // 출력: "hollo"

setCharAt(i, sb.charAt(j))는 단순히 i번째 값을 j번째로 복사하는 것이기 때문에, 이 문제에서 요구한 문자 교환(swap) 을 하려면 임시 저장 변수(temp)를 사용해야 한다.