© 2025 anveloper.dev
GitHub·LinkedIn·Contact

목차

  • 문제
  • 입력
  • 출력
  • 예제
  • 풀이
  • 코드
  • 복잡도
풀이 목록으로 돌아가기

BOJ 3447 - 버그왕

2024-09-09
BOJ
브론즈 I
cpp
원본 문제 보기
문자열
파싱

문제

BOJ 3447 - 버그왕

문자열이 주어질 때, "BUG"라는 부분 문자열을 더 이상 없을 때까지 반복적으로 제거한 결과를 출력하라.

입력

여러 줄의 문자열이 EOF까지 주어진다.

출력

각 줄에서 "BUG"를 반복 제거한 결과를 출력한다.

예제

입력출력
ABUGCAC
ABABUGBUGGCCABCC

풀이

각 줄에 대해 "BUG" 문자열을 정규식으로 치환하며 반복 제거한다.

  1. getline으로 EOF까지 한 줄씩 입력받는다
  2. find("BUG")로 "BUG"가 존재하는지 확인한다
  3. 존재하면 regex_replace로 모든 "BUG"를 빈 문자열로 치환한다
  4. 제거 후 새로운 "BUG"가 생길 수 있으므로 없을 때까지 반복한다

핵심 아이디어: "ABBUGUgc"처럼 "BUG" 제거 후 남은 문자가 합쳐져 새로운 "BUG"가 되므로, 한 번의 치환이 아닌 반복 치환이 필요하다.

코드

#include <bits/stdc++.h>
using namespace std;
string s;
 
int main()
{
  ios_base::sync_with_stdio(0);
  cin.tie(0);
  cout.tie(0);
  while (getline(cin, s))
  {
    while (s.find("BUG") != -1)
    {
      s = regex_replace(s, regex("BUG"), "");
    }
    cout << s << "\n";
  }
}

복잡도

  • 시간: O(N^2 / 3) (최악의 경우 중첩된 BUG 반복 제거)
  • 공간: O(N) (N: 문자열 길이)