본문 바로가기
Algorithm/📖Baekjoon

# 11478 서로 다른 부분 문자열의 개수

by yewoneeee 2022. 5. 21.

# 문제

# 입력 및 출력

# 풀이

저번처럼 map을 사용해서 풀었음

문자열을 자르는 함수는 substr함수를 사용했음

https://modoocode.com/235

 

C++ 레퍼런스 - string 의 substr 함수

 

modoocode.com

substr함수는 인자값으로 pos, count를 받는데

문자열에서 pos부터 pos+count까지의 문자열을 반환해줌

pos+count가 문자열의 실제 길이보다 길다면 그 이상을 반환하지 않고 문자열의 끝까지만 리턴함


#include <iostream>
#include <string>
#include <map>
using namespace std;
map<string, int> m;
int main() {
	string s;
	cin >> s;
	for (int i = 1; i <= s.size(); i++) {
		for (int j = 0; j < s.size() - i + 1; j++) {
			m[s.substr(j, i)] = 1;
		}
	}
	cout << m.size() << "\n";
}

따라서 두번째 for문에서 종료 조건부분은 그냥 j<s.size() 해도 상관은 없음

pos+count가 실제 문자열보다 길면 오류없이 그냥 알아서 최대 길이만큼 리턴해주기 때문임

근데 이렇게 하니까 시간초과가 나서 그냥 s.size()-i+1로 작성해줌


그리고 map대신 set을 사용해도됨

set도 map과 마찬가지로 중복허용이 안되기 때문임

여기선 key, value 쌍으로 필요하진 않기 때문에 set이 더 적합해보임

https://blockdmask.tistory.com/79

 

[C++] set container 정리 및 사용법

안녕하세요. BlockDMask 입니다 ! 오늘은 연관 컨테이너 set, multiset, map, multimap 중 set에 대해 학습해보겠습니다. 순서는 set container -> set의 사용법 -> set의 생성자와 연산자 -> set의 멤버 함수 -..

blockdmask.tistory.com

#include <iostream>
#include <string>
#include <set>
using namespace std;
set<string> s;
int main() {
	string str;
	cin >> str;
	for (int i = 1; i <= str.size(); i++) {
		for (int j = 0; j < str.size() - i + 1; j++) {
			s.insert(str.substr(j, i));
		}
	}
	cout << s.size() << "\n";
}

'Algorithm > 📖Baekjoon' 카테고리의 다른 글

#1931 회의실 배정  (0) 2022.05.23
#11729 하노이 탑 이동 순서  (0) 2022.05.21
#1269 대칭 차집합  (0) 2022.05.20
#1764 듣보잡  (0) 2022.05.19
#10816 숫자 카드 2  (0) 2022.05.18

댓글