알고리즘/Java 알고리즘

StringBuilder [자바] (프로그래머스 -코드 처리하기)

지니어스팍 2023. 11. 3. 13:17
728x90
728x90

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

 

프로그래머스

코드 중심의 개발자 채용. 스택 기반의 포지션 매칭. 프로그래머스의 개발자 맞춤형 프로필을 등록하고, 나와 기술 궁합이 잘 맞는 기업들을 매칭 받으세요.

programmers.co.kr

일단 내가 푼 방법

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

https://da2uns2.tistory.com/entry/Java-StringBuilder-%EC%82%AC%EC%9A%A9%EB%B2%95%EA%B3%BC-%EC%A3%BC%EC%9A%94-%EB%A9%94%EC%86%8C%EB%93%9C

 

자 이제 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