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,000queries
: 길이 1~1,000- 각 원소는
0 ≤ s ≤ e < my_string.length()
- 각 원소는
코드
- 문자열을
StringBuilder
로 변환해서 수정 가능하도록 함 - 각
[s, e]
에 대해 투포인터로 문자열을 뒤집음 - 모든 쿼리를 순서대로 적용 후, 최종 문자열을 반환
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));
메서드 이름 | 설명 |
---|---|
|
|
|
|
위 메서드의 사용법은 아래와 같다.
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)를 사용해야 한다.