20231206_StringBuilder

2023. 12. 6. 21:20IT/TIL

오늘의 TIL은 코드카타에서 문자열 나누기라는 문제를 접하게 되어

StringBuilder에 대한 내용을 공부하고 적용하여

이에 대한 내용을 TIL로 작성하려고 하였다.

 

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

 

프로그래머스

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

programmers.co.kr

 

우선 StringBuilder의 기초적인 내용을 살펴보면

 

MicroSoft의 설명

더보기

String 개체는 변경할 수 없습니다. 

System.String 클래에서 메서드 중 하나를 사용할 때마다 메모리에 새 문자열 개체가 생성되므로, 

새 개체에 대한 공간을 새로 할당해야 합니다. 문자열을 반복적으로 수행해야 하는 경우 

새로운 String 개체 생성과 관련된 오버헤드로 인해 비용이 증가할 수 있습니다. 

새 개체를 만들지 않고 문자열을 수정하려는 경우 System.Text.StringBuilder 클래스를 사용할 수 있습니다. 

예를 들어 StringBuilder 클래스를 사용하면 루프에서 많은 문자열을 연결할 때 성능이 향상될 수 있습니다.

 

이전의 값 타입, 참조 타입에서 String의 특이성을 공부했었는데,
String은 참조 타입이지만, Heap에 있는 String의 데이터는 수정할 수 없기에
String의 데이터를 수정하면, Stack에 있는 참조는 그대로 있지만,
Heap에 있는 데이터는 그대로 두고, 새로운 데이터를 만든 뒤에
그 데이터를 참조가 바라보게하는 방식으로 데이터를 수정하게 만들었다.

즉, String의 경우 데이터를 수정하는 경우에 
가비지라고 불리는 사용하지 않는 데이터가 쌓이다가 
어느 순간 제거하는 식으로 작동하기 때문에 메모리 소모가 많이 되게 된다.

 

이를 보완해주는 것이 StringBuilder이다.

StringBuilder myStringBuilder = new StringBuilder("Hello World!");

 

StringBuilder는 위처럼 선언하여 사용할 수 있다.
StringBuilder에 사용할 수 있는 메서드는 아래와 같다.

메서드 이름 기능
StringBuilder.Append 현재 StringBuilder의 끝에 정보를 추가합니다.
StringBuilder.AppendFormat 문자열에 전달된 서식 지정자를 서식 있는 텍스트로 바꿉니다.
StringBuilder.Insert 현재 StringBuilder의 지정된 인덱스에 문자열 또는 개체를 삽입합니다.
StringBuilder.Remove 현재 StringBuilder에서 지정된 수의 문자를 제거합니다.
StringBuilder.Replace 현재 StringBuilder에서 발견되는 지정된 문자 또는 문자열을 지정된 다른 문자 또는 문자열로 모두 바꿉니다.

 

이제 이 기초지식을 가지고 문제를 풀려고 접근했으나,

문제에서 묻는 지식은 StringBuilder를 사용하지 않아도 해결할 수 있는 문제였다.

 

문제의 답은 아래와 같다.

더보기
using System;

public class Solution {
    public int solution(string s) {
        int answer = 0;
        
        int cnt1 = 0; 
        int cnt2 = 0;
        char[] chars = s.ToCharArray();
        char currentChar = chars[0];

        for (int i = 0; i < chars.Length; i++)
        {

            if (chars[i] == currentChar)
            {
                cnt1++;
            }
            else if (chars[i] != currentChar)
            {
                cnt2++;
            }

            if(cnt1 == cnt2)
            {
                answer++;
                if ( i < chars.Length - 1 )
                {
                    currentChar = chars[i + 1];
                }
            }
            
            if (i == chars.Length - 1 && cnt1 != cnt2)
                answer++;
        }
            
        return answer;
    }
}

 

'IT > TIL' 카테고리의 다른 글

20231208_Generic, 오브젝트풀, SOLID원칙  (0) 2023.12.08
20231207_팀 프로젝트 회고  (1) 2023.12.07
20231205_유니티 애니메이션  (2) 2023.12.05
20231204_값 타입, 참조 타입, Class  (0) 2023.12.04
20231201_Button UI  (0) 2023.12.01