1. 문제
문자열 S가 주어졌을 때, S의 서로 다른 부분 문자열의 개수를 구하는 프로그램을 작성하시오.
부분 문자열은 S에서 연속된 일부분을 말하며, 길이가 1보다 크거나 같아야 한다.
예를 들어, ababc의 부분 문자열은 a, b, a, b, c, ab, ba, ab, bc, aba, bab, abc, abab, babc, ababc가 있고, 서로 다른 것의 개수는 12개이다.
- 입력
첫째 줄에 문자열 S가 주어진다. S는 알파벳 소문자로만 이루어져 있고, 길이는 1,000 이하이다.
- 출력
첫째 줄에 S의 서로 다른 부분 문자열의 개수를 출력한다.
- 설명
예제 입력 | 예제 출력 |
ababc | 12 |
11478번: 서로 다른 부분 문자열의 개수
첫째 줄에 문자열 S가 주어진다. S는 알파벳 소문자로만 이루어져 있고, 길이는 1,000 이하이다.
www.acmicpc.net
2. 풀이
substring을 이용해 부분 문자열을 추출해서 리스트에 넣고, Distinct로 중복을 제거하고 몇 개인지 셌다.
이중 for문을 이용해 길이 j번째 인덱스에서 시작하는 길이 i인 부분문자열을 Substring으로 추출했다.
// 서로 다른 부분 문자열의 개수
string input = Console.ReadLine();
int l = input.Length;
int count = 0;
for (int i = 1; i <= l; i++) { // 길이 i인 부분집합
List<string> list = new List<string>();
// j번째 인덱스에서 시작하는 부분집합을 리스트에 추가
for (int j = 0; j <= l-i; j++)
list.Add(input.Substring(j, i));
// 중복을 제거한 리스트의 내용물의 개수를 저장
count += list.Distinct().ToArray().Count();
}
Console.WriteLine(count);
'컴퓨터&프로그래밍 > Baekjoon' 카테고리의 다른 글
[백준/C#] 13241 - 최소공배수 (0) | 2023.11.15 |
---|---|
[백준/C#] 1934 - 최소공배수 (0) | 2023.11.06 |
[백준/C#] 1269 - 대칭 차집합 (0) | 2023.11.05 |
[백준/C#] 1764 - 듣보잡 (0) | 2023.11.04 |
[백준/C#] 10816 - 숫자 카드 2 (0) | 2023.11.03 |