StringBuilder의 reverse()메서드를 사용할 때 실수한 점과 정리할 사항이 있어 정리하고자 합니다.
문제설명
입력 & 출력
실수한 점 (잘못된 풀이)
package Level1;
public class Solution134240 {
public String solution(int[] food) {
StringBuilder sb= new StringBuilder();
for (int i = 1; i < food.length; i++) {
int cnt = 0;
cnt = food[i] / 2;
if(cnt > 0){
String str = String.valueOf(i);
sb.append(str.repeat(cnt));
}
}
String reverseStr = sb.reverse().toString();
sb.append("0").append(reverseStr);
return sb.toString();
}
public static void main(String[] args) {
Solution134240 sol = new Solution134240();
//int[] food = {1,3,4,6};
int[] food = {1,7,1,2};
System.out.println(sol.solution(food));
}
}
"푸드 파이트 대회"문제는 문자열을 조작하는 간단한 문제입니다. 저는 처음에 StringBuilder의 reverse()메서드를 사용하여 풀이를 했는데, 실수한점이 있어 정리하고자 합니다.
StringBuilder의 reverse() 메서드는 문자열을 간편하게 역순으로 만드는 메서드입니다. 따라서 저는 위 코드와 같이 음식의 개수를 2로 나누고, 몫만큼 반복하는 구조로 작성했습니다.
그러나 1113이 들어가고, 0을 붙이고, 1113을 뒤집은 03111을 붙이려고 했지만, 원했던 결과 "111303111"이 아닌 "311103111"이 나왔습니다.
이유는 reverse() 메서드를 호출할 때, 원본 문자열 1113이 역순으로 변경되어 03111이 됩니다. 그리고 이 역순 문자열이 원본 문자열에 추가되면서 최종 결과가 311103111이 되었습니다.
즉, 저는 원본 객체를 뒤집는다는 사실을 잊고, sb를 뒤집은 후 reverseStr에 뒤집은 문자열을 담으려고 했습니다.
하지만 reverse() 메서드는 원본 문자열을 변경시키기 때문에, 결과적으로 reverseStr에 담긴 문자열이 아닌 원본 문자열이 변경되어 의도한 대로 결과를 조합하지 못한 것입니다.
나의 풀이
따라서 원본 문자열을 보존하기 위해서, reverseStr이라는 StringBuilder를 새로 만들고, 원본 sb를 역순으로 뒤집어 reverseStr에 저장한 후, 원본 문자열에 중간 0을 추가하고 reverseStr을 결합하는 방식으로 문제를 해결했습니다.
이렇게 하면 원본 문자열 sb의 상태를 변경하지 않고도 원하는 결과를 얻을 수 있습니다.
참고❗️
'Coding Test' 카테고리의 다른 글
[프로그래머스] Lv0 접두사,접미사인지 확인하기(JavaScript) (1) | 2024.01.14 |
---|