문제

버그 투성이 프로그램을 잘 만드는 백준이는 버그를 찾는 프로그램을 만들었다.

이 프로그램은 프로그램의 소스 코드를 입력으로 받은 뒤, 버그를 발견하면 해당 부분을 주석처리해준다.

하지만, 버그를 찾는 프로그램도 백준이가 작성했기 때문에 버그가 있다. 바로, 주석처리하는 대신에 그 부분을 BUG로 바꿔버린다.

버그 찾는 프로그램이 처리한 결과가 주어졌을 때, BUG를 모두 없애는 프로그램을 작성하시오.

입력

입력은 여러 줄의 소스 코드로 이루어져 있다. 이 소스 코드는 백준이가 작성한 버그를 찾는 프로그램으로 이미 처리가 되어있다. 각 줄은 100글자 이내이고, 입력은 파일이 끝날 때 끝난다. 줄의 개수는 따로 제한을 두지 않는다.

출력

입력으로 주어진 소스 코드의 BUG를 모두 제거한 뒤 출력한다. 출력하는 소스 코드에는 BUG가 있으면 안 된다. 즉, ABUBUGGB와 같은 경우는 AB가 되어야 한다.

예제 입력 1 복사

print "No bugs here..."

void hello() {
BUGBUG
printfBUG("Hello, world!\n");
}

wriBUGBUGtelBUGn("Hello B-U-G");

예제 출력 1 복사

print "No bugs here..."

void hello() {

printf("Hello, world!\n");
}

writeln("Hello B-U-G");

 

문제풀이

주어진 입력 값이 BUG라는 단어가 없어야함

 

 

문제해결

입력값에 BUB라는 단어가 없을때 까지 반복한다(재귀) 

ABUBUGGB -> ABUGB-> ABUGB-> AB-> 종료

 

정규식은 한줄에 해당하는 규칙이 있는 경우만 찾아서 반환을 해주기 때문에

입력값에 해당 단어가 없을때까지 계속적으로 반복하려면

정규식을 해당 규칙이 없을 때 까지 반복시켜줘야 한다. 

 

이를 하기 위해서 재귀함수 사용

재귀 함수를 돌리는데 매개변수로 들어온 값이 정규식으로 BUG라는 단어를 찾은 후 변환된 값이 없는 경우가

더이상 문자열 내에 BUG라는 단어가 없다는 것이다.

이때 종료

 

import re

def recursion(s) :
    regex = re.compile("(BUG)")
    transed_string = re.sub(regex, "", s)
    if s == transed_string :                #입력값이 변환된 값과 같은 경우 더이상 BUG 없음
        return transed_string               #반환 및 종료
    return recursion(transed_string)        #입력된 값이 변환된 값과 같지 않아 다시 변환 필요(재귀 처리)

while True :
    try :
        input_string = input()
        print(recursion(input_string))
    except :
        break
[백준 | 브론즈1] 버그왕(정규식, 재귀-단어 없애기)