TIL

[C++] 2026-05-18 코딩 테스트 첫걸음: 문자열과 벡터(자료구조) 핵심 정리

think95592 2026. 5. 18. 20:46

📝 오늘 학습을 시작하며 (작성 이유)

  • 오늘부터 본격적으로 C++ 및 프로그래머스 코딩 테스트 학습 시작.
  • 처음 마주하는 개념들이 빠르게 쏟아져 나와 머릿속 지식들이 아직 파편화되어 있음.
  • 나중에 혼자 다시 보며 완벽하게 복습하고, 같은 실수를 반복하지 않기 위해 기록으로 남김.

📌 1. 핵심 개념 한눈에 보기 (요약 표)

분류 함수 및 문법 핵심 기능 / 용도 복습용 한줄 팁
문자열 s[index] = 'Char'; 특정 위치의 문자 직접 수정 단일 문자를 바꿀 때는 replace보다 훨씬 빠르고 간결함.
자료구조 v.push_back(value); 벡터(배열) 맨 뒤에 데이터 추가 데이터가 들어올 때마다 배열 크기가 알아서 늘어남.
자료구조 v.erase(Iterator); 특정 위치의 데이터 삭제 인덱스 정수(0, 1)가 아니라 **메모리 주소(Iterator)**를 넣어야 함.
알고리즘 min_element(begin, end) 배열 내 최솟값의 주소 찾기 값 자체가 아니라 **주소값(반복자)**을 반환하므로 주의할 것.
알고리즘 max_element(begin, end) 배열 내 최댓값의 주소 찾기 min_element와 세트. 마찬가지로 주소값을 반환함.
알고리즘 swap(A, B); 두 변수/배열 칸의 값 맞바꾸기 임시 변수(temp)를 생성하는 번거로움 없이 한 줄로 처리 가능.
기초 문법 for (int i=1; i<=n; ++i) 지정한 횟수만큼 반복 연산 i < n은 n 직전까지, i <= n은 n 본인까지 포함하여 반복함.
기초 문법 if (num % 2 == 1) 홀수 / 짝수 조건 판별 %는 나머지 연산자. 나머지가 1이면 홀수, 0이면 짝수임.

🔍 2. 깊이 파고들기: 오늘 발생한 트러블슈팅

🚨 핵심 이슈: 주소값(Iterator)과 인덱스(정수)의 혼동

C++ 벡터를 다룰 때 min_element나 erase 같은 함수들은 숫자가 아니라 메모리 주소(Iterator)를 기준으로 작동함. 이 개념을 헷갈리면 엉뚱한 메모리를 참조하여 런타임 에러가 발생할 수 있음.

  • arr.begin(): 배열의 첫 번째 칸 주소
  • arr.end(): 배열의 마지막 칸 바로 다음 주소 (경계면)
  • min_element(begin, end): 최솟값이 들어있는 칸의 주소

💡 해결 공식: 주소로 인덱스(방 번호) 구하기

  • "최솟값 주소 - 시작 주소"를 수행하면 그 사이의 칸수(인덱스 정수)를 얻을 수 있음.
  • 숫자끼리의 뺄셈이 아니라 주소끼리의 뺄셈을 통해 거리를 구하는 원리임.
C++
 
// 1. 올바른 인덱스 구하기 (최솟값 주소 - 시작 주소 = 0부터 시작하는 정수)
int min_index = min_element(arr.begin(), arr.end()) - arr.begin();

// 2. 인덱스 변환 없이 주소로 바로 지우기 (더 깔끔한 방식)
auto it = min_element(arr.begin(), arr.end());
arr.erase(it); // erase는 주소를 인자로 받으므로 바로 전달 가능

🚀 3. 코딩 테스트 풀이 역량 향상을 위한 체크리스트

  1. 반복문 경계 조건 디테일 챙기기
    • 문제를 읽고 이하(<=), 미만(<) 조건을 정확히 구분할 것.
    • 끝자리 숫자 하나 때문에 정확성 테스트에서 탈락할 수 있음.
  2. for문 증감식 최적화 (굳이 if문을 안 써도 되는 경우)
    • 홀수나 배수만 골라내야 할 때, 1씩 키우며 if문으로 매번 검사하기보다 i += 2(홀수), i += 3(3의 배수)처럼 건너뛰기를 활용하는 것이 연산 횟수를 줄이는 방법임.
  3. 자료구조 변형 시 메모리 흐름 의식하기
    • 벡터(vector)에서 중간에 있는 원소를 erase로 지우면, 뒤에 있던 데이터들이 빈자리를 채우기 위해 앞으로 한 칸씩 밀려와 인덱스가 재조정됨을 기억할 것.