알고리즘/Java 알고리즘
StringBuilder [자바] (프로그래머스 -코드 처리하기)
지니어스팍
2023. 11. 3. 13:17
728x90
728x90
https://school.programmers.co.kr/learn/courses/30/lessons/181932
일단 내가 푼 방법
class Solution {
public Stack<Character> stack = new Stack<>();
public String solution(String code) {
String answer = "";
boolean modeZero = true;
for(int i=0;i<code.length();i++){
char c = code.charAt(i);
if(c=='1'){
modeZero = !modeZero;
continue;
}
if(modeZero && i %2==0){
stack.push(c);
}else if(!modeZero && i%2!=0){
stack.push(c);
}
}
if(stack.isEmpty()) answer = "EMPTY";
else {
while(!stack.isEmpty()){
answer += stack.pop();
}
answer = new StringBuilder(answer).reverse().toString();
}
return answer;
}
}
String끼리의 연결의 성능저하
알고리즘 문제를 풀다보니 문자열을 계속 이어붙이는 코드를 짜게된다. 하지만 이때 String 끼리 더하는 방법은 성능이 좋지않다고한다.
그 이유는 String의 메모리 할당과 해제를 발생시키는데, 덧셈 연산이 많아진다면 성능적으로 좋지 않다.
많은 문자열을 연결하면 많은 중간 문자열 객체가 생성되어 비효율적인 코드가 생성된다고 한다.
자바에서 String 객체는 변경 불가능하다. 한 번 생성되면 내용을 바꿀 수 없단 뜻이다.
따라서 하나의 문자열을 다른 문자열과 연결하면 새 문자열이 생성되고, 이전 문자열은 가비지 컬렉터로 들어간다.
StringBuilder
이 경우 고려해볼 수 있는 것 중 하나가 StringBuilder다. Stirng은 변경 불가능한 문자열을 생성하지만 StringBuilder는 변경 가능한 문자열을 만들어 주기 때문에, String을 합치는 작업 시 하나의 대안이 될 수 있다
StringBuilder 사용하기
public class sb {
public static void main(String[] args) throws IOException{
StringBuilder sb = new StringBuilder("aaa");
// 문자열 추가
System.out.println(sb.append("bbb")); // aaabbb
System.out.println(sb.append(4)); // aaabbb4
// 문자열 삽입
System.out.println(sb.insert(2, "ccc")); // aacccabbb4
// 문자열 치환, 문자열 교체
System.out.println(sb.replace(3, 6, "ye")); // aacyebbb4
// 인덱싱, 문자열 자르기
System.out.println(sb.substring(5)); // bbb4
System.out.println(sb.substring(3, 7)); // yebb
// 문자 삭제
System.out.println(sb.deleteCharAt(3)); // aacebbb4
// 문자열 삭제
System.out.println(sb.delete(3, sb.length())); // aac
// 문자열 변환
System.out.println(sb.toString()); // aac
// 문자열 뒤집기
System.out.println(sb.reverse()); // caa
// 문자 대체, 문자 교체, 문자 치환
sb.setCharAt(1, 'b');
System.out.println(sb); // cba
// 문자열 길이 조정
sb.setLength(2);
System.out.println(sb); // cb
}
}
출처
https://onlyfor-me-blog.tistory.com/317
자 이제 StringBuilder를 사용해서 다시 풀어보자!
class Solution {
public String solution(String code) {
StringBuilder sb = new StringBuilder();
String answer = "";
int mode = 0;
for(int i=0;i<code.length();i++){
char c = code.charAt(i);
if(c=='1'){
mode = mode==0? 1:0;
continue;
}
if(mode==0 && i %2==0){
sb.append(c);
}else if(mode==1 && i%2!=0)
sb.append(c);
}
answer = sb.toString();
if(answer.length()==0) answer = "EMPTY";
return answer;
}
}
StringBuilder를 알게되면서 앞으로 더 성능을 신경쓰며 문자열을 다룰 수 있게되었다!
728x90
728x90