본문 바로가기

Programming Practice/C#11

[C#] 메모리 효율의 극대화: String과 StringBuilder, 그리고 GC의 관계 C# 개발자라면 누구나 "문자열 합칠 때는 StringBuilder를 써라"라는 말을 들어봤을지도....하지만 왜 그래야 하는가?내부적으로는 어떤 일이 벌어지는가?는 모르는 경우도 있을 것이다.닷넷(.NET) 환경의 메모리 관리 체계인 가비지 컬렉터(GC)와 문자열의 관계를 알아보자. 1. String의 불변성(Immutability)이란?C#에서 string 객체는 한 번 힙(Heap) 메모리에 생성되면 그 내용을 수정할 수 없다.- 예시: str = "Hello"; str += " World";- 내부 동작: "Hello"라는 객체가 생성됨. => " World"를 더하는 순간, 기존 메모리가 수정되는 것이 아니라 "Hello World"라는 새로운 객체가 메모리에 할당됨.- 문제점: 루프 문 안에서.. 2026. 4. 9.
백준 1834 나머지와 몫이 같은 수 C# class B1834_B1{ static void Main() { // 자연수 x를 n으로 나눴을 때, 목 : q, 나머지 : r // x = n*q+r = n*r+r = r(n+1) // 예제 2의 경우 int로 하면 숫자가 넘쳐서 오버플로우가 발생함. // 그래서 long으로 선언. long n = long.Parse(Console.ReadLine()); long sum = 0; for (int r = 0; r // 다른 풀이class B1834_B1{ static void Main() { long n = long.Parse(Console.ReadLi.. 2026. 3. 24.
백준 9253 스페셜 저지 C# using System;class B9253_B2{ static void Main(string[] args) { string a = Console.ReadLine(); string b = Console.ReadLine(); string c = Console.ReadLine(); if(a.Contains(c) && b.Contains(c)) { Console.WriteLine("YES"); } else { Console.WriteLine("NO"); } }} String.Contains 메서드는 특정 문자열이 대상 문자열 안에 포함되어 있는지를 확인하여 bool값(true / false)을 반환한다. 코드에서 a.Contains(c)가.. 2026. 3. 16.
백준 14914 사과와 바나나 나눠주기 C# using System;using System.Text;// 사과와 바나나 나눠주기// 브루트 포스class B14914_B3{ static void Main(string[] args) { string[] s = Console.ReadLine().Split(); int a = int.Parse(s[0]); int b = int.Parse(s[1]); StringBuilder sb = new StringBuilder(); for(int i = 1; i 이 문제는 브루트 포스(Brute Force) 키워드가 있는 문제다.브루트 포스는 '무식한 힘'이라는 뜻으로, 문제를 해결하기 위해 가능한 모든 경우의 수를 일일이 확인하는 방법. 이 코드에서는...모든 범위 탐색: 1부터 시.. 2026. 3. 16.
백준 10828 스택 | StringBuilder StringBuilder를 안 쓴 것과 쓴 것의 차이 먼저 안 쓴 것class B10828_S4{ static void Main() { int n = int.Parse(Console.ReadLine()); Stack stack = new Stack(); for(int i = 0; i StringBuilder 사용using System.Text;// 스택class B10828_S4{ static void Main() { int n = int.Parse(Console.ReadLine()); Stack stack = new Stack(); StringBuilder sb = new StringBuilder(); for(int i = 0; i 메모리에서는 큰 차이가.. 2026. 3. 7.
CS0161 오류 클래스를 활용하여 계산기 코드를 짜고 있던 중에 거슬리는 CS0161에러. 저 에러 하나 때문에 빌드가 안 되고 있던 중이라 대체 뭐가 문제일까 검색해봤다.not all code paths return a value. 말 그대로 모든 반환값이 리턴되진 않는다 뭐 그런 뜻.해결법은 아주 간단했다. switch (op){ case Operator.Add: return n1 + n2; case Operator.Subtract: return n1 - n2; case Operator.Multiply: return n1 * n2; case Operator.Divide: if (n2 == 0) { Console.WriteLine("0으로 나눌 수 없음."); return 0; .. 2025. 6. 8.
백준 3003 킹, 퀸, 룩, 비숍, 나이트, 폰 C# using System; namespace ChessSet{ class Chess{ static void Main(){ string[] input = Console.ReadLine().Split(); int[] w = {1, 1, 2, 2, 2, 8}; for(int i = 0; i < input.Length; i++){ w[i] -= int.Parse(input[i]); } foreach(int j in w) Console.Write(j.ToString() + " "); } } } https://www.acmicpc.net/problem/3003 3003번: 킹, 퀸, 룩, 비숍, 나이트, 폰 첫째 줄에 동혁이가 찾은 흰색 킹, 퀸, 룩, 비숍, 나이트, 폰의 개수가 주어진다. 이 값은 0보다 크거나 .. 2023. 9. 16.
백준 2744 대소문자 바꾸기 C# https://www.acmicpc.net/problem/2744 2744번: 대소문자 바꾸기 영어 소문자와 대문자로 이루어진 단어를 입력받은 뒤, 대문자는 소문자로, 소문자는 대문자로 바꾸어 출력하는 프로그램을 작성하시오. www.acmicpc.net using System; public class Test { public static void Main() { string s = Console.ReadLine(); string res = ""; for(int i = 0; i < s.Length; i++){ char current = s[i]; //current값이 대문자인지 체크하고 맞으면 소문자로, 틀리면 대문자로. res += char.IsUpper(current) ? char.ToLower(s[i.. 2023. 9. 10.
백준 2738 행렬 덧셈 C# https://www.acmicpc.net/problem/2738 2738번: 행렬 덧셈 첫째 줄에 행렬의 크기 N 과 M이 주어진다. 둘째 줄부터 N개의 줄에 행렬 A의 원소 M개가 차례대로 주어진다. 이어서 N개의 줄에 행렬 B의 원소 M개가 차례대로 주어진다. N과 M은 100보다 작거나 같 www.acmicpc.net using System; namespace Baekjoon { class Program { static void Main(string[] args) { string[] s = Console.ReadLine().Split(); int n = int.Parse(s[0]); int m = int.Parse(s[1]); int[,] A = new int[n, m]; int[,] B = ne.. 2023. 9. 10.