상세 컨텐츠

본문 제목

백준 9935 - 문자열 폭발(C++)

알고리즘/문제

by deulee 2023. 6. 10. 00:07

본문

문제

문자열이 하나와 폭발 문자열이 하나 주어진다.

 

문자열에 폭발 문자열이 포함되고 있는 경우, 모든 폭발 문자열이 폭발하게 된다. 남은 문자열을 순서대로 이어 붙여 새로운 문자열을 만든다.

 

이때 폭발 문자열이 남지 않을 때 까지 이를 반복하여 최종적으로 남은 문자열을 출력하는 문제다.

 

만약 아무런 문자도 남지 않은 경우 "FRULA"를 출력한다.

 

입력

두 개의 문자열이 차례대로 입력된다.

 

예제 입력

mirkovC4nizCC44
C4

 

예제 출력

mirkovniz

 

문제 해결

어디서 힌트를 얻을 수 있을까?

 

애초에 이 문제는 문제 설명 자체에서 힌트를 준 것이나 다름이 없다. 폭발 문자열를 만났을 때 해당 문자열은 없애고 새로 만들어진 문자열을 다시 검사하고 또 이를 반복하는 것이기 때문이다.

 

이를 그대로 코드로 옮기면 문제를 해결할 수 있다.

 

이때, 새로 만들어진 문자열을 어떻게 처리할 수 있냐가 문제인데, 문자를 차례대로 스택에 저장했다가 폭발 문자열을 만났을 때 스택에서 지우는 형식으로 풀 수 있다.

 

코드

#include <iostream>
#include <vector>
#include <string>

std::string solveStr(std::string str, std::string cmp)
{
	std::string temp = "";
	bool flag = false;
	int size = 0;
	int cmpLen = cmp.length();
	for (int i = 0; i < str.size(); i++)
	{
		temp += str[i];
		flag = false;
		if (temp.size() >= cmpLen)
		{
			for (int j = 0; j < cmpLen; j++)
			{
				if (temp[temp.size() - cmpLen + j] != cmp[j])
					break;
				if (j == cmpLen - 1)
					flag = true;
			}
			if (flag)
				temp.erase(temp.end() - cmpLen, temp.end());
		}
	}
	if (temp.size() == 0)
		return "FRULA";
	return temp;
}

int main(void)
{
	std::string str, cmp;
	std::cin >> str >> cmp;
	std::cout << solveStr(str, cmp) << std::endl;
	return 0;
}

 

문제 출처

https://www.acmicpc.net/problem/9935

 

9935번: 문자열 폭발

첫째 줄에 문자열이 주어진다. 문자열의 길이는 1보다 크거나 같고, 1,000,000보다 작거나 같다. 둘째 줄에 폭발 문자열이 주어진다. 길이는 1보다 크거나 같고, 36보다 작거나 같다. 두 문자열은 모

www.acmicpc.net

 

'알고리즘 > 문제' 카테고리의 다른 글

백준 11053 - 가장 긴 증가하는 부분 수열 (C++)  (0) 2023.06.24
백준 10830 - 행렬 제곱(C++)  (0) 2023.06.10
백준 9663 - N-Queen(C++)  (0) 2023.06.06
백준 9465 - 스티커(C++)  (0) 2023.06.06
백준 9251 - LCS(C++)  (2) 2023.06.05

관련글 더보기