Skip to main content
Summary

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)

  • 로직 흐름:

    1. 숫자를 진법(N)으로 나눈 나머지를 저장.

    2. 숫자를 진법(N)으로 나눔.

    3. 숫자가 0이 될 때까지 반복.

    4. 저장된 값들을 역순(Reverse)으로 정렬하면 해당 진법 숫자가 됨.

  • 주의사항: 문제에 따라 역순이 아닌 "뒤집힌 3진법" 상태로 계산을 요구하는 경우(예: 프로그래머스 '3진법 뒤집기')가 있으니 요구사항을 잘 확인해야 함.

  1. 저장된 값들을 역순(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++)

이 노트는 보도·비평·교육·연구 목적으로 작성되었습니다. 저작권 문의가 있으시면 에서 알려주세요.

틸노트는 사용자가 AI를 활용해 노트를 쉽게 작성하거나 편집할 수 있는 서비스입니다.

AI 스퀘어 단톡방에 함께해요

AI 활용과 틸노트 사용 팁을 나누는 오픈채팅방입니다. 입장 비밀번호는 tilnote입니다.

참여하기