1. 문자열 처리 (String Handling)
std::string: C++의 동적 문자열 클래스.+연산자로 결합,==로 비교 가능.stoi(),stoll(): 문자열을int나long long으로 변환. (알고리즘 문제에서 숫자의 범위가 크면stoll사용 필수)to_string(): 숫자(int, float 등)를 문자열로 변환.substr(pos, len):pos인덱스부터len길이만큼 문자열을 추출.s.clear(): 문자열의 내용을 비움.s.erase(iter): 특정 위치의 문자를 제거.s.back(): 문자열의 마지막 문자를 반환.
2. 문자 유틸리티 (Character Utilities - <cctype>)
isdigit(c): 문자가 숫자인지 확인.isalpha(c): 문자가 알파벳인지 확인.toupper(c)/tolower(c): 문자를 대문자/소문자로 변환.
3. STL 컨테이너 (Containers)
std::vector: 동적 배열.push_back(),size(),empty()등을 주로 사용.std::unordered_map: 해시 테이블 기반의 Key-Value 저장소. 탐색 속도가 $O(1)$로 매우 빠름. 중복 확인이나 카운팅에 유용.std::map: Red-Black Tree 기반. Key가 정렬된 상태로 유지됨. 탐색 속도 $O(\log N)$.
4. 알고리즘 (Algorithms - <algorithm>)
std::sort(begin, end): 기본 오름차순 정렬.greater<type>(): 내림차순 정렬 시 사용.Lambda 활용:
sort(v.begin(), v.end(), { ... })커스텀 정렬 기준 정의.
std::reverse(begin, end): 범위를 거꾸로 뒤집음.std::min_element(),std::max_element(): 최솟값/최댓값을 가리키는 반복자(iterator) 반환.std::gcd(),std::lcm(): 최대공약수와 최소공배수 (C++17 이상<numeric>헤더).
5. 모던 C++ 문법 (Modern C++)
auto: 컴파일러가 타입을 추론. 반복자나 복잡한 타입을 다룰 때 유용.Range-based for loop:
for (auto c : s)형태로 컨테이너의 모든 요소를 순회.static_cast<type>(): 안전한 명시적 형변환. (예:static_cast<long long>(a) * b)
6. 문제 해결 팁
Lookup Table: 반복되는
if-else대신 배열이나vector에 데이터를 미리 담아두고 인덱스로 접근하여 코드 간결화.오버플로우 주의: 문제에서 주어지는 숫자의 범위가 크면
int대신long long을 사용해야 함.정렬 후 중복 제거:
sort와unique,erase를 조합하여 중복 원소 제거 가능.v.erase(unique(v.begin(), v.end()), v.end());
7. 날짜 및 요일 계산 (Date & Day of Week)
C 표준 라이브러리
<ctime>활용std::tm구조체:<ctime>헤더에 정의된 시간 정보를 담는 구조체.tm_year: 1900년 이후의 연도 (예: 2016년은 116).tm_mon: 1월부터의 월 (0-11).tm_mday: 월의 일 (1-31).tm_wday: 일요일부터의 요일 (0=일요일, 1=월요일, ..., 6=토요일).
mktime()함수:std::tm구조체의 필드들을 정규화하고,tm_wday등의 값을 채워줌. 이 함수를 호출해야tm_wday값이 정확하게 설정됩니다.활용 예시:
#include <ctime> // 또는 <chrono> (C++11 이후) // ... std::tm t = {}; t.tm_year = year - 1900; // 2016 - 1900 = 116 t.tm_mon = month - 1; // 5월은 4 t.tm_mday = day; // 24일 mktime(&t); // tm_wday가 채워짐 int dayOfWeek = t.tm_wday; // 0(SUN) ~ 6(SAT)요일 매핑:
tm_wday값을switch문이나vector<string>을 사용하여 요일 문자열로 변환.
8. 진법 변환 (Base Conversion)
나머지 연산 (
%): 특정 진법의 각 자리 숫자를 구할 때 사용. (예:n % 3은 3진법의 마지막 자리수)나누기 연산 (
/): 다음 자리 계산을 위해 숫자를 줄일 때 사용. (예:n /= 3)로직 흐름:
숫자를 진법(N)으로 나눈 나머지를 저장.
숫자를 진법(N)으로 나눔.
숫자가 0이 될 때까지 반복.
저장된 값들을 역순(Reverse)으로 정렬하면 해당 진법 숫자가 됨.
주의사항: 문제에 따라 역순이 아닌 "뒤집힌 3진법" 상태로 계산을 요구하는 경우(예: 프로그래머스 '3진법 뒤집기')가 있으니 요구사항을 잘 확인해야 함.
저장된 값들을 역순(Reverse)으로 정렬하면 해당 진법 숫자가 됨.
9. 유용한 STL 함수 및 테크닉
std::swap(a, b): 두 변수의 값을 교체. 구조체나 컨테이너에도 사용 가능.std::stoll(s):string을long long으로 변환.int범위를 넘어서는 숫자가 포함된 문자열 처리 시 필수.std::substr(pos, count): 문자열의 일부를 추출.pos부터count개의 문자를 반환.greater<T>():sort함수 등에서 내림차순 정렬을 위해 사용하는 함수 객체.sort(v.begin(), v.end(), greater<int>());static_cast<T>(): 명시적 형변환. 특히v.size()(unsigned)와int를 비교할 때 발생하는 경고를 방지하기 위해 사용.for (int i = 0; i <= static_cast<int>(s.size()) - n; i++)
이 노트는 보도·비평·교육·연구 목적으로 작성되었습니다. 저작권 문의가 있으시면 에서 알려주세요.