분류 전체보기 16

[C++] STL vector - size/capacity부터 iterator invalidation까지

1. STL이란?STL (Standard Template Library)은 프로그래밍에 필요한 자료구조와 알고리즘을 템플릿 형태로 제공하는 C++ 표준 라이브러리다.컨테이너 (Container): 데이터를 저장하는 자료구조 (vector, list, map 등)반복자 (Iterator): 컨테이너의 원소를 순회하기 위한, 포인터와 유사한 개념의 인터페이스알고리즘 (Algorithm): sort, find 등 컨테이너에 독립적으로 동작하는 함수들2. 배열의 한계와 vector의 등장C 스타일 배열은 크기가 고정이라는 한계가 있다.const int MAX_SIZE = 10;int arr[MAX_SIZE] = {};이 한계를 보완한 것이 vector, 즉 동적 배열이다. vector는 크기가 가변적이라는 점만..

공부 2026.08.02

const int* vs int* const 차이

C/C++ 공부하다 보면 반드시 한 번은 헷갈리는 지점이 const와 포인터의 조합이다. 오늘 정리한 내용을 기록해둔다.포인터가 들고 있는 두 가지포인터 변수는 메모리 공간을 하나 차지하면서, 그 안에 주소값을 저장하고 있다. 그래서 포인터에는 "고정할 수 있는 대상"이 두 가지 존재한다.포인터가 가리키는 데이터 (주소를 따라갔을 때 나오는 값)포인터 자기 자신이 담고 있는 주소값const를 어디에 붙이느냐에 따라 이 둘 중 무엇을 고정할지가 갈린다.int a = 10, b = 20;const int* p1 = &a; // (1) 가리키는 데이터가 constint* const p2 = &a; // (2) 포인터 자체가 const(1) const int* p1 — 가리키는 값을 못 바꾼다이 포인터를..

공부 2026.07.26

malloc의 정렬(alignment)과 힙 오버플로우

들어가기에 앞서 malloc에 대해 짧게 설명하자면, malloc은 힙(heap)이라는 메모리 영역에서 동적으로 메모리를 할당받는 C 표준 라이브러리 함수다.스택 변수와 다르게, 힙 메모리는:프로그램이 런타임에 크기를 결정할 수 있음 (컴파일 타임에 크기가 고정되는 배열과 다름)명시적으로 free()를 호출하기 전까지 계속 살아있음 (함수가 끝나도 사라지지 않음)힙 관리자(heap manager)라는 별도의 소프트웨어가 이 영역을 추적하고 관리함 (OS가 직접 관리하는 게 아니라, CRT/힙 라이브러리가 OS로부터 큰 덩어리를 받아와서 잘게 쪼개 나눠주는 방식)라느 특징을 가진다.malloc 내부 구조malloc(12)를 호출하면 힙 관리자는 단순히 "12바이트를 뚝 떼어서 준다"가 아니라, 그 블록을 ..

공부 2026.07.11

strlen, strcpy, strcmp / memcpy, memcmp 구현

strlensize_t strlen(const char* str);인자: str — 길이를 잴 널 종단 문자열의 시작 주소반환값: size_t — \0 직전까지의 문자 개수 (\0 자체는 카운트 안 함)설명: str부터 한 칸씩 전진하며 \0을 만날 때까지 카운트. \0을 찾아야 끝나는 구조라 시간복잡도 O(n). 순수 바이너리 데이터에 쓰면 안 됨(중간에 우연히 0바이트가 있으면 거기서 멈춰버림).strcpychar* strcpy(char* dest, const char* src);인자: dest — 복사받을 목적지 버퍼(반드시 src 길이+1 이상 크기여야 함) / src — 복사할 원본 널 종단 문자열반환값: char* — dest의 시작 주소 (체이닝 목적)설명: src를 처음부터 \0까지 한 바..

공부 2026.07.11

스파이럴(달팽이) 배열 구현하기 - 방향배열(dx, dy) 방식

시리즈 마지막 방식이다. 코드가 짧고, 방향이 더 늘어나도(대각선 8방향 등) 배열 하나만 늘리면 확장되는 방식이다. 해당 방식은 방향이 필요한 모든 알고리즘에 통용적으로 사용이 가능하며, 게임 알고리즘에서도 종종 사용된다 — 예를 들어 캐릭터의 8방향 이동 처리, 타일 기반 맵에서의 인접 칸 탐색(BFS/DFS), 몬스터의 순찰 경로 계산 같은 곳에서 같은 dx[], dy[] 패턴을 그대로 가져다 쓸 수 있다.방식 설명핵심 아이디어는 "방향 자체를 데이터로 만든다"는 것이다.오른쪽·아래·왼쪽·위, 이 4가지 이동을 if-else나 case로 나누는 대신, dx[], dy[]라는 배열에 미리 저장해두고, dir 값 하나로 "지금 배열의 몇 번째 방향을 쓰는 중인지"만 관리한다.dx[dir], dy[dir..

공부 2026.07.09

스파이럴(달팽이) 배열 구현하기 - 경계값(Boundary) 방식

이번엔 스파이럴 배열 문제의 "정석" 풀이로 통하는 경계값 방식을 정리한다. 코딩테스트에서 스파이럴/나선 행렬 문제가 나오면 가장 먼저 떠올려야 하는 접근이다. 방식 설명핵심 아이디어는 앞선 두 방식과 또 다르다. 배열 값이 채워졌는지(0인지) 보는 대신, 네 방향의 한계선(top, bottom, left, right)을 숫자로 직접 관리한다. 한 방향을 채우면 그 방향의 경계선을 안쪽으로 한칸 좁힌다.switch 방식이 "배열 값이 0인지"로 다음 칸을 판단했다면, 이 방식은 배열 값을 전혀 들여다보지 않고 오직 숫자 네 개(top, bottom, left, right)만으로 어디까지 채웠는지 판단한다. 그래서 한 바퀴가 끝날 때마다 ++top, --right, --bottom, ++left로 테두리가..

공부 2026.07.08

스파이럴(달팽이) 배열 구현하기 - 대칭 축소(nLength) 방식

앞서 설명한 문제의 교재 답지에 있던 방식이다.문제 정의5x5 정수 배열을 아래처럼 시계방향 나선형으로 1부터 25까지 채우는 게 목표다.1 2 3 4 516 17 18 19 615 24 25 20 714 23 22 21 813 12 11 10 9방식 설명핵심 아이디어는 한 바퀴를 위쪽/오른쪽 + 아래쪽/왼쪽 두 구간으로 쪼개서, 같은 부호(nDirecton)로 x와 y를 순서대로 움직인다. 한라운드가 끝나면 부호를 뒤집고, 다음 루프는 테두리 한 칸 안쪽(nLength -= 2)에서 반복한다. nLength는5x5배열 기준 9에서 시작해 2씩 줄어들며 9,7,5,3,1, 다섯 라운드를 수행한다.안쪽 for문은 매 바퀴 nLength를 반복하는데, 앞쪽..

공부 2026.07.08

스파이럴(달팽이) 배열 구현하기 - switch/case 방향 전환 방식

C로 5x5 스파이럴 배열을 채우는 문제를 여러 방식으로 구현해보면서, 각 방식의 원리와 장단점을 정리해본다. 첫 번째로 다룰 방식은 switch문으로 방향을 관리하는 방식이다.(처음 문제를 보고 내가 푼 방식이라 많이 와일드 하다. 나머지 3개는 교재참고, 다른 자료를 참고한 방식이다.)문제 정의5x5 정수 배열을 아래처럼 시계방향 나선형으로 1부터 25까지 채우는 게 목표다.1 2 3 4 516 17 18 19 615 24 25 20 714 23 22 21 813 12 11 10 9 방식 설명핵심 아이디어는 간단하다. 한 방향으로 갈 수 있는 데까지 가고, 막히면(이미 채워진 칸을 만나면) 다음 방향으로 90도 회전한다.방향은 4가지뿐이므로 enu으..

공부 2026.07.08

선택정렬

선택정렬의 특징1. 최솟값 선택 기반 정렬인접한 두 원소만 비교하는 버블 정렬과 다르게, 매 라운드마다 남은 범위 전체를 훑어서 최솟값의 위치를 먼저 찾고, 그 다음에 현재 위치와 딱 한 번만 교환하는 방식이다. 비교는 멀리 떨어진 원소끼리도 하지만, 교환은 매 라운드당 최대 한 번 일어난다. 2. 시간 복잡도바깥 루프가 n번 돌고, 안쪽 루프(최솟값 탐색)는 바깥 루프가 진행될수록 반복 횟수가 점점 줄어들어(n,n-1,n-2,...,1) 총 비교 횟수는 버블 정렬과 똑같이 등차수열의 합 공식에 의해 n(n-1)/2번이 된다. 빅오 표기법으로는 O(n²)이다. 다만 버블정렬과 결정적으로 다른 점은, 배열이 이미 정렬되어 있어도, 안쪽 루프를 끝까지 다 돌아야 최솟값 위치를 확신할 수 있어서 최선의 경우에..

공부 2026.07.07

우리는 왜 UTF-8을 써야 하는가

*아래 글은 Claude AI가 저와 대화하면서 나눈 내용을 정리한 것입니다. 결론은 제가 정리하였고, 최대한 공식 문서만을 반영하려고 하였습니다. 참고 자료는 글의 마지막에 정리하여 두었습니다. 부족한 부분이 있다면 지적해주시면 감사하겠습니다. Windows에서 C/C++로 콘솔 프로그램을 짜본 사람이라면 한 번쯤 겪어봤을 것이다. 분명 소스 코드에는 멀쩡하게 한글을 입력했는데, 컴파일 시점에 알 수 없는 경고가 뜨거나, 실행했을 때 콘솔 화면에 글자가 물음표나 깨진 문자로 출력되는 현상 말이다. 이 글에서는 이 현상이 왜 발생하는지, 그리고 표준 문서와 실제 업계가 어떤 방향을 가리키고 있는지를 정리한다.1. 인코딩 방식 정리: UTF-8, BOM, CP949, UTF-16문자를 컴퓨터에 저장하려면 ..

공부 2026.07.07