전체 글 275

[자료구조] std::list

std::forward_list개요 앞선 자료구조 포스트의 std::forward_list는 아주 기본적인 형태로 구현된 연결리스트다. 따라서 리스트 끝에 원소를 추가하거나, 역방향으로 이동하는 기초 기능 외에는 지원하지 않는다. 따라서 C++에서는 이러한 단점을 보완하기 위해 양방향 연결 리스트(doubly-linked list) std::list를 제공한다. 이를 사용하기 위해선 헤더파일을 임포트 해야 한다.구조 연속된 자료 구조와 연결된 자료구조 (2) with C++에서 그림을 하나 가져와보자.   보면 알겠지만, 노드끼리 서로 연결되어 있기 때문에 이전 노드를 가리키는 포인터, 다음 노드를 가리키는 포인터, 해당 노드에 있는 데이터를 갖고 있다. 간략하게 형태를 코드로 파악하자면 다음과 같다...

CS/자료구조 2023.03.31

[자료구조] 메모리 청크

자료구조를 공부하다 보면 메모리 청크라는 단어를 자주 듣게 된다. 본 카테고리의 두 글을 보더라도, 청크라는 용어가 나온다. 단순히 메모리 덩어리라고 생각하기엔 추상적인 느낌이 강해 본 포스팅을 통해 구체화해 보도록 하자. 먼저 메모리 청크는 동적으로 메모리를 할당할 때 사용되는 일정한 크기의 메모리 블록을 의미한다. 이때 청크는 요소들 간 포인터를 사용하지 않는다. 각 청크는 배열 형태로 데이터를 저장하는 포인터와 청크의 크기, 다음 청크를 가리키는 포인터를 갖고 있다. 여기서 포인터를 사용하지 않는다는 것은 메모리 청크는 일반적인 포인터를 사용하지 않고, 인덱스 또는 오프셋을 사용하여 요소들을 참조한다는 의미다. 예를 들어, int 형 배열 arr 에서 arr[0] 에 접근하려면, arr의 시작 주소..

CS/자료구조 2023.03.18

[유니티] 방향, 크기, 회전 (2)

유니티 C# 벡터 Vector type 앞선 [유니티] 방향, 크기, 회전 (1) 포스트에서는 수학적 의미에서 벡터를 다루었다. 이번 게시글에서는 게임 개발에 필요한 기본적인 벡터 수학을 유니티 C#에 적용하는 방법을 알아보자. 유니티는 벡터를 표현하기 위해 Vetor2, Vector3, Vector4를 제공하고 있다. 가장 많이 사용할 Vector3의 정의를 보기 위해 유니티 공식 홈페이지에 접속해 보면 다음과 같이 설명하고 있다. 이때 주목해야할 점은 Vector 타입이 구조체(struct)로 선언되어 있다는 점이다. 클래스로 선언하지 않고 구조체를 이용한 이유는 값 타입으로 동작하게 하여 복사를 했을 때 수정되는 것을 막기 위해서다. 직관적으로 이해하기 위해 다음 예제를 보도록 하자. Vector3..

Game/Unity 2023.03.17

[C++] CH5 함수와 참조, 복사 (1)

함수와 인자 전달 방식 Call by Value 정의: 호출하는 코드에서 넘겨주는 실인자 값이 함수의 매개 변수에 복사되어 전달되는 방식 특징 함수 내에서 실인자를 손상시킬 수 없음 실인자의 크기가 크면 오버헤드가 발생하여 복사하는 시간이 길어짐 생성자는 실행되지 않고, 소멸자만 실행됨 (생성자와 소멸자 비대칭 문제) Call by Address 정의: 주소를 직접 포인터 타입의 매개 변수에 전달하는 방식 특징 의도적으로 함수 내에서 실인자의 값을 변경시킬 때 사용 원본 객체를 복사하는 시간 소모가 없음 생성자와 소멸자의 비대칭 문제가 없다 함수 호출 시 객체 전달 다음 예제에 있는 각각의 출력문 cout에서 waffle의 radius 값을 생각해보자. // 예제 5-1 #include using nam..

Language/C++ 2023.02.28

[백준] 2559 with C++

문제설명 입출력 예제 개념 특정 구간까지의 수열의 합을 구하는 문제다. 단순히 반복문을 중첩시켜 결괏값을 얻으려 하면 십중팔구 시간초과에 걸린다. 이러한 문제처럼 연속된 값을 더하는 문제를 풀 땐 구간합 개념을 이용하면 쉽게 해결할 수 있다. 구간합(Prefix Sum) - 수열에서 특정 구간의 합 풀이 #include using namespace std; int N, K, temp, sum[100001], ret = -2147483647; int main() { cin >> N >> K; 온도를 측정한 전체 날짜의 수 N, 합을 구하기 위한 연속적인 날짜의 수 K, 구간합을 구할 배열 sum, 구간합 배열의 최솟값 변수 ret을 초기화한다. 이때 ret의 값은 int의 최솟값이다. for (int i ..

Algorithm/백준 2023.02.27

[백준] 9375 with C++

문제설명 입출력 예제 개념 의상의 종류의 개수에 따라 경우의 수를 계산하는 문제다. 의상의 종류와 개수를 매칭시킬 수 있으므로 map 자료구조를 이용하여 카운팅할 때 사용하면 된다. 여기서 조합(Combination)의 개념이 등장하는데, 서로 다른 n개의 원소를 순서에 상관없이 r개의 원소를 선택하는 것이다. 예를 들어 headgear, headgear, eyewear, face를 골랐으면 다음과 같이 계산하면 된다. 풀이 #include #include using namespace std; int main() { int num; cin >> num; 테스트 케이스의 개수를 num으로 초기화한다. while (num--) { map _map; int n; cin >> n; int result = 1; ..

Algorithm/백준 2023.02.24

[백준] 1620 with C++

문제설명 입출력 예제 개념 문자열을 입력받아 숫자와 매칭시키는 문제다. 정해진 개수만큼 문자열 입력이 끝나면, 숫자를 입력했을 때 문자열을 출력하고, 문자열을 입력했을 때 숫자를 출력하면 된다. 따라서 2개의 값을 매칭시키는 문제이므로 map 자료구조를 이용해 주면 된다. 풀이 #include #include #include using namespace std; int main() { ios::sync_with_stdio(false); cin.tie(NULL); cout.tie(NULL); 이 문제를 풀다 보면 시간 초과 문제가 빈번하게 일어난다. 따라서 이를 미연에 방지하기 위해 c언어와의 싱크를 해제해 주고, cin과 cout의 tie를 풀어 시간을 조금이라도 단축시켰다. int n, m; cin >..

Algorithm/백준 2023.02.22

[백준] 1940 with C++

문제설명 입출력 예제 개념 실버 단계에 랭크되어 있지만, 문제만 제대로 이해한다면 브론즈 단계의 문제다. 고유 번호를 합쳤을 때, 갑옷을 만드는 데 필요한 수를 확인하면 간단하게 해결할 수 있는 문제다. 풀이 #include using namespace std; int main() { int N, M, cnt = 0; int ary[150001] = {0}; cin >> N >> M; for (int i = 0; i > ary[i]; 재료의 개수 N, 갑옷을 만드는 데 필요한 개수 M, 재료의 고유 번호 ary를 초기화해준다. for (int i = 0; i < N; i++) { for (int j = i + 1; j < N; j++) { if (ary[i] + ary[j] =..

Algorithm/백준 2023.02.21