본문 바로가기
코딩테스트 준비/백준

[백준 11478번][C++] 서로 다른 부분 문자열의 개수

by 스테디코디스트 2023. 8. 5.
반응형

<문제 소개>


<소스 코드>

#include <iostream>
#include <string>
#include <vector>
#include <sstream>
#include <map>
#include <unordered_map>
#include <set>
#include <cmath>
#include <stack>
#include <queue>
#include <algorithm>
#include <cstdlib>
using namespace std;

int main()
{
	// 쓰레드 환경이 아닐때 버퍼를 분리하여 처리속도를 빠르게 해줌
	ios_base::sync_with_stdio(false);
	cin.tie(NULL);
	cout.tie(NULL);

	string s;
	cin >> s;

	set<string> subWord;

	for (int i = 1; i <= s.length() ; i++)
	{
		for (int startWord = 0; startWord <= s.length() - i; startWord++)
		{
			string curWord = s.substr(startWord, i); // 저장할 문자
			subWord.insert(curWord);
		}
	}

	cout << subWord.size();

	return 0;
}

<풀이과정>

1. 주어진 문자 s를 입력받고, 각 부분문자열을 담을 string형 set subWord를 선언한다.

2. set를 사용한 이유는 부분문자열의 중복을 없애고 해당 개수를 파악하기 위함이다.

3. 먼저 각 문자의 개수를 나타내는 i를 1부터 s의 길이까지 반복하고, 그 안에서 시작 단어를 나타내는 startWord를 맨 앞 인덱스인 0부터 각 문자열의 길이에 맞는 범위인 s의 길이에서 i를 뺀 s.length() - i 인덱스까지 반복한다.

4. 위의 과정을 반복하면서 substr()함수를 이용해 시작 단어부터 각 문자의 개수에 따라 부분문자열을 추출하고, 해당 문자열을 subWord에 넣어준다.

5. 모든 과정이 끝난 뒤 부분문자열의 집합인 subWord의 개수를 출력한다.


<코멘트>

substr() 함수와 이중 for문을 이용하여 풀었다!


<제출결과>