코딩테스트 문제를 풀면서 마주쳤던 논리적 오류와 C#의 문자열 처리 효율성,
그리고 자료형(Type) 관련 이슈들을 정리한 글입니다.
문제 상황:
두 문자열(str1, str2)을 번갈아 합칠 때 이중 foreach 문을 사용하면,
내부 반복문이 매번 초기화되어 str2의 첫 글자만 계속 붙는 오류가 발생함.
해결 방법:
두 문자열의 길이가 같으므로, 단일 for 문을 사용하여 같은 인덱스(i)로 동시에 접근해야 함.
// [Bad] 이중 반복문 (논리 오류)
foreach(char c1 in str1) {
foreach(char c2 in str2) { ... } // 매번 처음부터 다시 돔
}
// [Good] 단일 인덱스 접근
StringBuilder sb = new StringBuilder();
for(int i = 0; i < str1.Length; i++)
{
sb.Append(str1[i]);
sb.Append(str2[i]);
}
+= vs StringBuilderQ. 문자열을 합칠 때 그냥 += 연산자를 써도 되지 않나?
+= 연산자: C#의 string은 불변(Immutable) 객체임. +=를 할 때마다 새로운 메모리를 할당하고 기존 값을 복사하므로 성능 저하가 심함 (특히 반복문 안에서).StringBuilder: 가변(Mutable) 객체로, 기존 메모리 공간에서 문자열을 조립하므로 속도가 훨씬 빠름.string.Join: 배열에 담긴 문자열을 합칠 때 가장 간결하고 빠름.// [권장] 반복문이 많을 때
StringBuilder sb = new StringBuilder();
sb.Append("A");
// [권장] 배열을 합칠 때
string[] arr = { "a", "b", "c" };
string result = string.Join("", arr);
* 연산자 대체)C#에는 문자열 곱하기("A" * 5) 연산자가 없음. 상황에 따라 아래 방법을 사용.
string str = new string('a', 5); // "aaaaa"StringBuilder나 LINQ 사용// StringBuilder로 반복해서 Append 하거나,
// LINQ 사용: string.Concat(Enumerable.Repeat("abc", 3))StringBuilder 뒤에 .ToString()을 붙이는 이유StringBuilder는 문자열을 만드는 '도구(공장)'이고, 반환 타입인 string은 '완성품'임.
자료형이 다르기 때문에 ToString()을 통해 string 타입으로 변환 후 반환해야 함.
문제 상황:
StringBuilder 타입으로 선언된 변수에 int 값을 억지로 할당하려고 하여 컴파일 에러 발생.
StringBuilder sb1 = new StringBuilder();
// sb1 = int.Parse("123"); // [Error] StringBuilder 변수에 int를 넣을 수 없음
해결 방법:
C#은 정적 타이핑 언어이므로, 변환된 값은 알맞은 타입의 변수에 따로 저장해야 함.
단순 병합 후 비교라면 문자열 보간이 더 효율적임.
// [Better] 문자열 보간법 사용
int num1 = int.Parse($"{a}{b}");
int num2 = int.Parse($"{b}{a}");
return Math.Max(num1, num2);