StringBuilder - 문자열 변경하기
코딩 테스트에서 반복문을 통해 문자열을 만드는 작업을 할 때 StringBuilder라는 클래스를 많이 사용합니다.
StringBuilder의 가장 큰 장점은 String과 다르게 문자열을 '변경가능(가변)'하다는 점에 있습니다.
※String(문자열)은 불변이라는 특징이 있습니다. 이 때문에 문자열을 수정할 때마다 내부적으로 새로운 문자열이 생성됩니다.
따라서 반복문 안에서 문자열을 반복적으로 변경하면, 의도치 않게 많은 메모리 공간이 할당되어 자원이 낭비될 수 있습니다.
- 네임스페이스: using System.Text;
- 주요 메서드: Append(), Insert(), Remove()
- 반환 값: StringBuilder
- C# 공식 문서: https://learn.microsoft.com/ko-kr/dotnet/api/system.text.stringbuilder?view=net-8.0
객체 생성
using System.Text;
// StringBuilder 객체 생성
StringBuilder sb1 = new StringBuilder();
StringBuilder sb2 = new StringBuilder("Hello ");
Console.WriteLine($"초기 상태: \"{sb1}\", 길이: {sb1.Length}");
// 출력 결과: 초기 상태: "", 길이: 0
Console.WriteLine($"초기 상태: \"{sb2}\", 길이: {sb2.Length}");
// 출력 결과: 초기 상태: "Hello ", 길이: 6
Append() - 내용 추가하기
문자열, 숫자, 문자 등 다양한 데이터를 맨 뒤에 추가합니다
using System.Text; // 필수 using 구문
// StringBuilder 객체 생성
StringBuilder sb = new StringBuilder("Hello ");
// 문자열, 문자, 숫자를 차례대로 추가
sb.Append("World");
sb.Append('!');
sb.Append(" This is number ");
sb.Append(123);
Console.WriteLine($"Append 후: \"{sb}\"");
// 출력 결과: Append 후: "Hello World! This is number 123"
sb.AppendLine(); // 현재 내용 뒤에 줄바꿈만 추가
sb.AppendLine("This is the second line.");
Console.Write($"AppendLine 후:\n{sb}"); // Console.Write를 사용해 줄바꿈을 실제로 확인
/* 출력 결과:
AppendLine 후:
Hello World! This is number 123
This is the second line.
*/
Insert() - 특정 위치에 내용 삽입하기
원하는 위치(인덱스)에 데이터를 삽입합니다.
- 형식: StringBuilder.Insert(int index, object value)
※주의점: sb의 index위치가 유효하지 않으면 System.ArgumentOutOfRangeException 에러 발생
using System.Text; // 필수 using 구문
// StringBuilder 객체 생성
StringBuilder sb = new StringBuilder("Hello ");
// 인덱스6 위치에 "C#"이라는 문자열을 삽입
sb.Insert(6, "C#");
Console.WriteLine($"Insert 후: \"{sb}\"");
// 출력 결과: Insert 후: "Hello C#"
Replace() - 특정 내용을 다른 내용으로 바꾸기
문자열 전체에서 특정 문자 또는 문자열을 찾아 다른 내용으로 모두 바꿉니다.
- 형식: StringBuilder.Replace(object oldValue, object newValue)
using System.Text; // 필수 using 구문
// StringBuilder 객체 생성
StringBuilder sb = new StringBuilder("Hello C#");
// "C#"을 "CSharp"으로 변경
sb.Replace("C#", "CSharp");
Console.WriteLine($"Replace 후: \"{sb}\"");
// 출력 결과: Replace 후: "Hello CSharp"
Remove() - 특정 부분 삭제하기
원하는 위치(index)에서부터 특정 길이만큼의 문자를 삭제합니다.
- 형식: StringBuilder.Remove(int startIndex, int length)
using System.Text; // 필수 using 구문
// StringBuilder 객체 생성
StringBuilder sb = new StringBuilder("Hello CSharp World!");
// 인덱스 5부터 7글자를 삭제 ("CSharp" 부분)
sb.Remove(5, 7);
Console.WriteLine($"Remove 후: \"{sb}\"");
// 출력 결과: Remove 후: "Hello World!"
Clear() - 모든 내용 지우기
StringBuilder 내부의 모든 내용을 깨끗하게 비웁니다. 객체를 새로 만들지 않고 재사용할 때 유용합니다.
using System.Text; // 필수 using 구문
// StringBuilder 객체 생성
StringBuilder sb = new StringBuilder("Hello ");
sb.Clear();
Console.WriteLine($"Clear 후: \"{sb}\", 길이: {sb.Length}");
// 출력 결과: Clear 후: "", 길이: 0
ToString() - String 형식으로 변환하기
string 형식의 객체에 StringBuilder형식을 담을 수 없으므로 모든 편집 작업이 끝난 후, 최종 결과물을 string 타입으로 변환하여 반환합니다.
using System.Text; // 필수 using 구문
// StringBuilder 객체 생성
StringBuilder sb = new StringBuilder("Final Result");
string finalString = sb.ToString();
Console.WriteLine($"ToString() 결과: \"{finalString}\" (타입: {finalString.GetType()})");
// 출력 결과: ToString() 결과: "Final Result" (타입: System.String)
팁: 메서드 체이닝Method Chaining
Append, Insert 등 대부분의 StringBuilder 메서드는 자기 자신(StringBuilder 객체)을 다시 반환합니다. 이 특징을 이용해 코드를 아래와 같이 연쇄적으로 작성할 수 있습니다.
StringBuilder chainSb = new StringBuilder();
// 메서드를 계속 이어서 호출
chainSb.Append("Start!")
.AppendLine()
.Append("Number is ")
.Append(100)
.Insert(0, "Chain Test: ")
.Replace("!", ".");
Console.WriteLine(chainSb.ToString());
/* 출력 결과:
Chain Test: Start.
Number is 100
*/
[예제] 프로그래머스 72410번 문제 : 신규 아이디 추천
링크: https://school.programmers.co.kr/learn/courses/30/lessons/72410
프로그래머스
SW개발자를 위한 평가, 교육의 Total Solution을 제공하는 개발자 성장을 위한 베이스캠프
programmers.co.kr
using System.Text;
public class Program
{
static void Main(string[] args)
{
string new_id = Console.ReadLine();
Console.WriteLine($"변경전 : {new_id}");
Console.WriteLine($"변경후 : {Solution(new_id)}");
}
public static string Solution(string new_id)
{
string input = "";
// 1단계: 모든 대문자를 소문자로 치환
input = new_id.ToLower();
// 2단계: 유효하지 않은 문자 제거
StringBuilder sb = new StringBuilder(); // StringBuilder 객체 생성
foreach (char c in input)
{
// char.IsLetterOrDigit(c)는 c가 알파벳 또는 숫자인지 확인합니다.
if (char.IsLetterOrDigit(c) || c == '-' || c == '_' || c == '.')
{
sb.Append(c);
}
}
// 3단계: 연속된 마침표(.)를 하나로 치환
while (sb.ToString().Contains(".."))
{
sb.Replace("..", ".");
}
// 4단계: 처음이나 끝에 위치한 마침표(.) 제거
if (sb.Length > 0 && sb[0] == '.')
{
sb.Remove(0, 1);
}
if (sb.Length > 0 && sb[sb.Length - 1] == '.')
{
sb.Remove(sb.Length - 1, 1);
}
// 5단계: 빈 문자열이라면 'a'를 대입
if (sb.Length == 0)
{
sb.Append('a');
}
// 6단계: 길이가 16자 이상이면, 첫 15개의 문자를 제외한 나머지 문자들을 모두 제거.
// 만약 제거 후 마침표(.)가 끝에 위치한다면 그 마침표도 제거.
if (sb.Length >= 16)
{
sb.Remove(15, sb.Length - 15);
if (sb[sb.Length - 1] == '.')
{
sb.Remove(sb.Length - 1, 1);
}
}
// 7단계: 길이가 2자 이하라면, 마지막 문자를 길이가 3이 될 때까지 반복해서 끝에 붙임.
if (sb.Length <= 2)
{
char lastChar = sb[sb.Length - 1];
while (sb.Length < 3)
{
sb.Append(lastChar);
}
}
return sb.ToString();
}
}
String.Substring() - 문자열 잘라내기
- 메서드: string.Substring()
- 네임스페이스: using System;
- 반환 값: string 타입
- C# 공식 문서: https://learn.microsoft.com/ko-kr/dotnet/api/system.string.substring?view=net-8.0
String.Substring 메서드 (System)
이 인스턴스에서 부분 문자열을 검색합니다. 이 멤버는 오버로드됩니다. 구문, 사용법 및 예제를 비롯하여 이 멤버에 대한 자세한 내용을 보려면 오버로드 목록에서 이름을 클릭합니다.
learn.microsoft.com
사용 예시
string text = "Hello, C# World!";
// Substring (int startIndex) - startIndex 위치부터 끝까지 자르기
// 인덱스 7('C') 부터 자르기
string result1 =text.Substring(7);
Console.WriteLine(result1);
// 출력 결과 : "C# World!"
// Substring(int startIndex, int length) - startIndex 위치부터 원하는 길이 만큼 자르기
// index 0 ('H')부터 5글자 자르기
string result2 = text.Substring(0, 5);
Console.WriteLine(result2);
// 출력 결과 : "Hello"
// 인덱스 7 ('C') 부터 2글자 자르기
string result3 = text.Substring(7, 2);
Console.WriteLine(result2);
// 출력 결과: "C#"
[예제] 프로그래머스 181907번 : '문자열의 앞의 n글자'
링크 : https://school.programmers.co.kr/learn/courses/30/lessons/181907
프로그래머스
SW개발자를 위한 평가, 교육의 Total Solution을 제공하는 개발자 성장을 위한 베이스캠프
programmers.co.kr
using System;
public class Solution {
public string solution(string my_string, int n) {
string answer = my_string.Substring(0, n);
return answer;
}
}
String.StartsWith() - 문자열이 주어진 value로 시작하는지 여부 확인하기
- 메서드: string.StartsWith(string value)
- 네임스페이스: using System;
- 반환 값: bool 타입, value로 시작하면 true, 그렇지 않으면 false
- C# 공식 문서: https://learn.microsoft.com/ko-kr/dotnet/api/system.string.startswith?view=net-8.0
사용 예시
string myStr = "Hello";
bool result1 = myStr.StartsWith("Hel"); // true
bool result2 = myStr.StartsWith("el"); // false
bool result3 = myStr.StartsWith("hell"); // false (대소문자 구분)
bool result4 = myStr.StartsWith("Helloo"); // false (길이가 더 김)
[예제] 프로그래머스 181906번 '접두사인지 확인하기'
링크 : https://school.programmers.co.kr/learn/courses/30/lessons/181906
프로그래머스
SW개발자를 위한 평가, 교육의 Total Solution을 제공하는 개발자 성장을 위한 베이스캠프
programmers.co.kr
for 문 사용시
using System;
public class Solution {
public int solution(string my_string, string is_prefix) {
if(my_string.Length < is_prefix.Length) return 0;
int answer = 0;
for(int i = 0; i < is_prefix.Length; i++)
{
if(my_string[i] == is_prefix[i])
answer = 1;
else
{
answer = 0;
break;
}
}
return answer;
}
}
C# StartsWith 메소드 사용
using System;
public class Solution {
public int solution(string my_string, string is_prefix) {
return my_string.StartsWith(is_prefix) ? 1 : 0;
}
}
String.Join(), String.Concat() - 여러 문자열 연결하기
링크: https://learn.microsoft.com/ko-kr/dotnet/csharp/how-to/concatenate-multiple-strings
여러 문자열을 연결 하는 방법 - C#
C#에서 문자열을 연결하는 방법에는 여러 가지가 있습니다. 옵션 및 다양한 선택 뒤에 있는 이유를 알아봅니다.
learn.microsoft.com
[예제] 프로그래머스 181941번 '문자리스트를 문자열로 변환하기'
StringBulder.Append() 사용
using System;
using System.Text;
public class Solution {
public string solution(string[] arr) {
StringBuilder sb = new StringBuilder();
for(int i = 0; i < arr.Length; i++)
{
sb.Append(arr[i]);
}
string answer = sb.ToString();
return answer;
}
}
String.Join() 사용
using System;
public class Solution {
public string solution(string[] arr) {
string answer = "";
answer = String.Join("", arr);
return answer;
}
}
String.Concat() 사용
using System;
public class Solution {
public string solution(string[] arr) {
string answer = string.Concat(arr);
return answer;
}
}