반응형

프로그래밍 62

C# 가비지 컬렉터(GC)

1. 가비지 컬렉션이란?가비지 컬렉션(GC)은 프로그램이 더 이상 사용하지 않는 메모리를 자동으로 해제하는 메모리 관리 시스템입니다. C#은 관리형 언어(Managed Language)로, 개발자가 직접 메모리를 할당하고 해제할 필요 없이 CLR(Common Language Runtime)이 자동으로 메모리를 관리합니다. . 2. 가비지 컬렉션의 작동 방식2.1 세대별 가비지 컬렉션 (Generational GC)C#의 GC는 3개의 세대(Generation)로 구성되어 있습니다:Gen 0: 새로 생성된 객체들이 위치Gen 1: Gen 0에서 살아남은 객체들이 위치Gen 2: Gen 1에서 살아남은 객체들이 위치 2.2 가비지 컬렉션 프로세스마킹(Marking): 사용 중인 객체를 식별압축(Compa..

프로그래밍/C# 2025.05.13

백준 C# 속도 개선

최근 백준 C#과 관련해서 시간초과 이슈가 있는 것 같습니다.이전에 통과했던 코드도 최근에는 시간초과로 통과가 안된다는 사례도 있었습니다.이러한 상황에서 속도 개선하는 방법을 공유하고자 합니다. Console.WriteLine백준 알고리즘 문제를 풀다 보면 많은 양의 출력이 필요한 경우가 있습니다.Console.WriteLine()은 호출될 때마다 실제로 콘솔에 출력하는 I/O 작업을 수행합니다. I/O 작업은 메모리 접근에 비해 매우 느린 작업이며, 이를 반복적으로 수행하면 프로그램의 성능이 크게 저하되며 시간 초과의 이유가 됩니다. 이 때, 사용할 수 있는 방법이 StringBuilder입니다. StringBuilder문자열을 바로 출력 하는 것이 아니라 StringBuilder를 통해 문자열을 저장..

프로그래밍/C# 2025.04.21

Behavior Tree 이론

행동 트리 (Behavior Tree) 이해하기 행동 트리란 무엇인가? 행동 트리(Behavior Tree, BT)는 인공지능(AI)에서 캐릭터나 시스템의 행동을 모듈식으로 구성하고 제어하는 데 사용되는 강력한 도구입니다. 특히 게임 개발에서 NPC(Non-Player Character)의 복잡한 의사 결정을 체계적으로 구현하는 데 널리 사용됩니다. 트리는 계층 구조를 가지며, 각 노드는 특정 작업이나 제어 흐름을 나타냅니다. 실행은 루트 노드에서 시작하여 자식 노드로 전달되는 '틱(tick)' 신호를 통해 이루어집니다. 핵심 개념: 노드와 틱(Tick) 행동 트리의 모든 연산은 '틱'이라는 단위로 이루어집니다. 루트 ..

프로그래밍 2025.04.10

인터페이스의 접근 제한자

C#에서 인터페이스를 구현할 때, 접근 제한자 문제로 인해IMouseListener.OnClick();처럼 인터페이스명을 붙여야 하는 경우와, public void OnClick()처럼 바로 사용할 수 있는 경우가 있습니다. 두 방식의 차이를 설명하겠습니다.  🔹 1. 인터페이스에서 접근 제한자가 없는 이유C#에서 인터페이스를 정의할 때, 메서드에 접근 제한자(public, private, protected 등) 를 명시할 수 없습니다.이유는 인터페이스는 구현이 아니라 설계만 정의하는 개념이기 때문입니다.public interface IMouseListener{ void OnClick(); // 접근 제한자 X}   🔹 2. 인터페이스는 무조건 public을 강제인터페이스를 구현하는 클래스는 ..

프로그래밍 2025.02.17

Github 협업 전략 [Github Desktop]

프로젝트 공유협업을 한다는 것은 하나의 파일을 여러 사람이 공유하며 함께 작업하는 것을 의미합니다.여러 사람이 한 프로젝트에서 작업을 하다보니 당연하게도 파일의 충돌이 일어날 수가 있고,그 속에서 오랜 시간 공들인 작업물이 사라지는 경우도 있을 것 입니다. Git hub 협업 전략한 프로젝트를 여러 사람과 공유할 때, 충돌을 최소화 할 수 있는 Github 전략을 소개합니다. 1. 개발 브랜치 만들기main에서 개발 브랜치를 생성합니다.2. 개인 브랜치 만들기dev에서 개인이 작업할 브랜치를 생성하고 해당 브랜치에서만 작업을 진행하게 됩니다.이때, 이름의 이니셜을 추가해서 누가 작업했는지 알 수 있게 하는 것도 좋은 방법입니다. 3. 개인 브랜치 개발 완료개인 브랜치의 개발이 완료되면 dev 브랜치와 합..

프로그래밍 2025.02.06

동적 계획법

2747번: 피보나치 수 (acmicpc.net) 피보나치는 수는 0과 1로 시작하며 2번째 부터는 앞의 두 수를 더해서 이어 나갑니다.즉 0, 1, 1, 2, 3, 5, 8, 13, 21, 34, 55, 89 --------으로 이어집니다. N번째 피보나치 수를 구하기를 여러번 반복하게 되는 상황에서매번 0부터 N까지 수를 구해나가면 굉장히 비효율 적입니다. 그렇기에 문제를 반복되는 작은 문제로 바꿀 수 있어야합니다.또한 문제들을 DP 테이블에 저장하여 재사용할 수 있게하여 속도를 높여야합니다.(메모이제이션 기법)이러한 것을 동적계획법이라 부르는데 톱-다운 방식과, 바텀-업 방식으로 구현할 수 있습니다.  톱 - 다운 방식#include #include using namespace std;static ..

이항계수 구하기

N개의 수 중 K개를 선택하는 경우의 수를 구하는 방법은 점화식을 구하는 것에서 부터 시작합니다. 5개중 3개를 선택하는 경우의 수 점화식의 경우D[5][3] = D[4][2] + D[4][3]5개중 3개를 선택하는 경우의 수는[4개의 수 중 2개를 선택한 경우의 수 + 4개의 수 중 3개를 선택한 경우의 수] 입니다. = 104개의 수 중 2개를 선택하는 경우의 수는[3개의 수 중 1개를 선택한 경우의 수 + 3개의 수 중 2개를 선택한 경우의 수] = 6 4개의 수 중 3개를 선택하는 경우의 수는[3개의 수 중 2개를 선택한 경우의 수 + 3개의 수 중 3개를 선택한 경우의 수] = 43개의 수 중 3개를 선택하는 경우의 수는[2개의 수 중 2개를 선택한 경우의 수 + 2개의 수 중 3개를 선택한 경..

세그먼트 트리

세그먼트 트리(Segment Tree)구간 쿼리와 수정이 빈번하게 일어나는 상황에서 유용하게 사용할 수 있는 자료구조입니다.배열의 특정 구간에 대한 정보를 빠르게 구하거나 업데이트할 때 사용되며구간의 최소값, 최대값, 합 등을 구할 수 있습니다.세그먼트 트리의 구조세그먼트 트리는 이진 트리 형태로, 각 노드가 배열의 특정 구간을 대표합니다.트리의 루트는 배열의 전체 구간을 대표하고, 각 리프 노드는 배열의 하나의 원소를 대표합니다.내부 노드는 자식 노드의 구간을 합쳐서 더 큰 구간을 대표합니다. 세그먼트 트리의 장점특정 구간에 대한 다양한 연산 결과를 빠르게 구할 수 있습니다.중간 데이터가 변경되어도 전체 구조를 재구축하지 않고 빠르게 반영할 수 있습니다.세그먼트 트리는 주로..

트리 순회

트리 순회(Tree Traversal) 트리 자료구조 내의 모든 노드를 체계적으로 방문하는 과정을 말합니다 이러한 순회는 데이터의 구조적 특성을 분석하거나 특정 연산을 수행하기 위해 사용됩니다. 대표적인 트리 순회 방법으로는 전위 순회(Preorder), 중위 순회(Inorder), 후위 순회(Postorder) 가 있습니다. 여기서는 이진 트리를 기준으로 설명하겠습니다. 1. 전위 순회 (Preorder Traversal) 전위 순회는 다음과 같은 순서로 노드를 방문합니다: 현재 노드를 방문한다. 왼쪽 서브트리를 전위 순회한다. 오른쪽 서브트리를 전위 순회한다. 이 방식은 노드를 처리한 후 자식 노드를 순차적으로 처리합니다. 따라서 트리의 루트를 먼저 처리하고자 할 때 유용합니다. 2. 중위 순회 (I..

트라이 (Trie)

트라이 (Trie) 자료구조 트라이 자료구조는 문자열 검색을 빠르게 실행할 수 있도록 설계한 트리 형태의 자료구조입니다 - 트라이의 형태 -예시 코드 class Node { public: Node* childs[26]; bool isEnd = false; Node() { fill(childs, childs + 26, nullptr); } void insert(const char* key) { if (*key == 0) { isEnd = true; return; } int nextID = *key - 'a'; if (childs[nextID] == nullptr) childs[nextID] = new Node(); childs[nextID]->insert(key + 1); } Node* find(const..

반응형