C++ erase의 문제점 / append (2025.07.25)

이정국(PBD)·2025년 7월 25일

TIL

목록 보기
36/69

*오늘 학습 내용*

코드카타 문제 / C++

1. ✅ 문자열에서 숫자 빈도수 세기(짝꿍 문제 - 63)

  • 두 정수 X, Y에서 각각 등장하는 숫자의 빈도를 vector로 관리
    → 인덱스 0~9에 해당 숫자의 개수를 카운트
    → cntX[c - '0']++ 처럼 범위 기반 for문으로 처리
vector<int> cntX(10, 0);
vector<int> cntY(10, 0);
    
for(char c : X) cntX[c - '0']++;
for(char c : Y) cntY[c - '0']++;
  • X와 Y를 각각 다 세어둔 뒤, 9부터 0까지 내려가면서
    → min(cntX[d], cntY[d])로 공통 개수를 구함
    → answer.append(common, '0' + d)로
    해당 숫자를 공통 개수만큼 answer에 추가
string answer = "";
    
for(int digit = 9; digit >= 0; --digit)
{
	int common = min(cntX[digit], cntY[digit]);
    answer.append(common, '0' + digit);
}
  • 최종적으로 answer를 확인
    → answer.empty()면 공통 숫자가 없으니 "-1"
    → answer[0] == '0'이면 전부 0뿐이니 "0"
    → 아니면 answer 그대로 반환
if(answer.empty()) return "-1";
if(answer[0] == '0') return "0";
    
return answer;

2. ✅ append(count, ch) 사용법 이해

std::string::append(size_type count, char ch) 오버로드 사용

  • answer.append(common, '0' + digit);
    → '0' + digit으로 실제 문자로 변환
    → 그 문자를 common번 반복해서 answer 뒤에 붙인다.

3. ✅ 효율적인 방법 선택의 이유

  • 처음 코드에서 erase를 사용하며
    중첩 for문을 돌려 O(N²)로 처리
    → 큰 입력에서 시간 초과 발생

  • 숫자가 0~9로 제한된 문제이므로 빈도수 배열로 O(N) 처리 가능

  • 성능뿐 아니라 코드 가독성도 향상됨.

4. ✅ 느낀 점

  • 문자열이나 컨테이너에서 erase를 빈번하게 쓰면
    성능이 기하급수적으로 느려질 수 있음.

  • 범위가 제한된 문제에서는 빈도수 세기가 정석적인 접근

  • append(count, ch)처럼 잘 모르는 오버로드도
    공식 문서를 참고하면 쉽게 이해가 가능

  • 번 로직을 구현했다면,
    그 로직의 시간 복잡도를 반드시 점검 해봐야함.

profile
창백한 푸른점 속 작은점

0개의 댓글