목록전체 글 (34)
흔한 덕후의 잡동사니
1. C#의 objectC#에서의 object는 모든 데이터 타입의 최상위 클래스이다. object로 선언된 객체는 .NET의 기본 가비지 컬렉션(GC) 시스템에 의해 관리되며 객체가 더 이상 참조되지 않으면 GC가 자동으로 메모리를 해제한다. 이 과정은 C#의 기본적인 메모리 관리 방식으로, 메모리 관리를 프로그래머가 직접 할 필요가 없다. 하지만 가비지 컬렉션은 일정한 간격으로 실행되므로, 이 시점에서의 성능 저하가 발생할 수 있다. + 성능 저하가 일어나는 이유와 발생 주기 및 조건에 대해선 다음에 GC에 대해서 정리하면서 설명할 예정이다. 아래는 이를 간단하게 설명한 것이다.더보기미리 간단하게 설명하자면, 2가지 이유로 성능 저하가 일어난다. 첫째, GC는 3세대(0, 1, 2 세대)로 관리되는데..
문제 : https://leetcode.com/problems/flood-fill/description/Solution인자로 받은 위치의 번호로부터 시작하여 4방향으로 인접한 위치에 같은 번호가 있을 경우 번호들을 모두 다른 값으로 바꾸는 문제이다. Flood Fill이라는 이름답게 이동할 수 있는 모든 위치를 찾는 문제가 보면 된다.#include #include #include class Solution{public: // 인자로 2차원 배열, 시작 위치(sr, sc), 변경하고자하는 색상 을 받는다. // 시작 위치에 있는 색상과 인접한 같은 색상을 인자로 받은 색상으로 변경하고, 변경된 2차원 배열을 반환하는 문제이다. std::vector> floodFill(std::vecto..
1. 텍스트 파일 입출력 (StreamWriter, StreamReader)텍스트 파일을 다룰 때 사용된다. 사람이 읽을 수 있는 형식으로 데이터를 처리한다.StreamWriter : 텍스트 파일에 데이터를 쓸 때 사용StreamReader : 텍스트 파일에서 데이터를 읽을 때 사용using (StreamWriter writer = new StreamWriter("example.txt")){ writer.WriteLine("Hello, world!");}using (StreamReader reader = new StreamReader("example.txt")){ string content = reader.ReadToEnd(); Console.WriteLine(content);} 문자 단..

문제 : https://leetcode.com/problems/largest-rectangle-in-histogram/description/Solution히스토그램의 각 막대의 높이가 배열로 주어질 때 히스토그램 내 가장 넓이가 큰 직사각형의 넓이를 반환하는 문제이다. #include #include #include int getMaxArea(std::vector& heights) { heights.push_back(0); // 마지막에 0을 추가하여 모든 높이를 처리할 수 있도록 함 std::stack st; int maxArea = 0; // 전체를 N번 순회, O(n) for (int i = 0; i = heights[i]) { int h = heigh..
1. 회전 방법: 오일러각 vs 쿼터니언회전의 경우 오일러각이라 불리는 x, y, z 축을 가지고 객체를 회전시키게 되는데, 행렬을 사용해 카메라를 조작하다보면 축이 겹치는 상황에서 객체의 회전이 180도 돌아버리는 상황이 나온다. 이를 짐벌락이라 한다. 짐벌락은 오일러 각에서 발생하는 회전 순서에 의해 발생하는 문제이다. 즉, 오일러 각은 회전 순서가 고정되어 있기 때문에, 예를 들어 첫 번째 축으로 회전한 후 두 번째 축을 회전시키면, 첫 번째 축의 회전이 두 번째 축에 영향을 미쳐서 비정상적인 회전 결과가 나오는 것이다. 이때 두 축이 평행해져서 더 이상 회전이 제대로 이루어지지 않으며, 이 상태를 짐벌락이라고 한다. 이 문제를 해결하기 위해 쿼터니언을 사용한다. 쿼터니언은 짐벌락 현상을 피할 수..
설명TransformDirection은 로컬 좌표계의 방향 벡터를 월드 좌표계 방향 벡터로 변환하는 함수이다. 예를 들어, 월드 좌표에서 오른쪽(1,0,0) 방향으로 이동하려는 플레이어가 있다고 하자. 하지만 Y축을 기준으로 90도 회전된 상태이상이 걸렸다고 가정하면 로컬 기준에서는 여전히 오른쪽이지만, 월드 좌표에서는 (0,0,-1) 방향으로 이동하게 된다.쓰는 이유DirectX 등에서 월드 행렬과 로컬 행렬을 따로 관리하는 방식을 생각해 보면 이해하기 쉽다. TransformDirection(로컬 방향 벡터) → [로컬 회전 행렬] × [월드 회전 행렬] 연산을 수행하여 변환된 방향 벡터를 반환한다. 이를 통해 회전 중인 객체라도 자연스럽게 방향을 계산할 수 있다. 추가 정보1. TransformD..
c#의 객체는 크게 2가지, 참조형(reference type) / 값 형식(value type) 로 나뉜다. 이는 저장되는 메모리의 위치에 따라 달라진다. 이와 관련된 문제점 중 boxing에 관하여 알아보고자 한다. new 키워드C#에서 new 키워드는 주로 객체를 생성하거나 값 타입을 초기화하는 데 사용된다.new를 사용할 때, 값 타입(구조체)일지라도 힙에 객체를 생성하지 않고, 스택에 값이 할당된다. 값 타입은 힙의 메모리 할당 없이 스택에 직접 할당되므로 가볍고 빠르다는 말이 많은데, 스택은 메모리 할당 과정이 없으니깐 당연히 빠르다. Boxing이란?Boxing은 값 타입(Value Type)을 참조 타입(Reference Type)으로 변환하는 과정을 의미한다. 이는 주로 object나 i..
List와 LinkedList의 주요 차이점내부 구조동적 배열 (연속된 메모리 할당)이중 연결 리스트 (노드 기반)메모리 사용연속된 메모리 블록 사용 (낭비 적음)추가적인 포인터 메모리 필요접근 속도O(1) (인덱스를 통한 빠른 접근)O(n) (순차 검색 필요)삽입/삭제 속도O(n) (중간 삽입/삭제 시 이동 필요)O(1) (노드 추가/삭제)인덱스 접근가능 (배열처럼 [index])불가능 (순차 탐색 필요)순차 접근빠름 (연속된 메모리로 캐시 효율적)느림 (노드를 따라가야 함)적합한 상황조회와 인덱스 기반 작업이 많은 경우빈번한 삽입/삭제 작업이 많은 경우 이는 C#의 List는 C++의 std::vector와, C#의 LinkedList는 C++의 std::list와 유사한 구조와 동작 방식을 가지기 ..