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

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

📌 문제


📌 제한사항


코드

  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--;
    }
}

✅ for (int[] query : queries)
✅ sb.setCharAt(i, sb.charAt(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)를 사용해야 한다.





Revision #4
Created 13 July 2025 14:31:16 by Dain
Updated 13 July 2025 14:43:47 by Dain