개요
C#에서는 Substring() 메서드를 활용하면 하나의 문자열에서 만들 수 있는 모든 부분 문자열을 손쉽게 추출할 수 있습니다.
예를 들어 다음과 같은 문자열이 있다고 가정해 보겠습니다.
pqr
부분 문자열 추출 원리
부분 문자열은 길이 1부터 문자열 전체 길이까지 단계적으로 잘라낼 수 있습니다. 바깥쪽 반복문은 추출할 부분 문자열의 길이(i)를 결정하고, 안쪽 반복문은 시작 위치(start)를 한 칸씩 이동시키며 해당 길이의 모든 부분 문자열을 얻어냅니다.
for (int start = 0; start <= str.Length - i; start++) {
string substr = str.Substring(start, i);
Console.WriteLine(substr);
}- i : 현재 추출할 부분 문자열의 길이
- start : 부분 문자열이 시작되는 인덱스
- str.Substring(start, i) : start 위치부터 i개의 문자를 잘라내 반환
전체 예제 코드
다음은 C#으로 문자열의 모든 부분 문자열을 찾는 완성된 프로그램입니다.
using System;
class Demo {
static void Main() {
string str = "pqr";
// 길이 1부터 문자열 전체 길이까지 순회
for (int i = 1; i <= str.Length; i++) {
for (int start = 0; start <= str.Length - i; start++) {
string substr = str.Substring(start, i);
Console.WriteLine(substr);
}
}
}
}
참고로 조건을 i < str.Length로 작성하면 문자열 자체("pqr")가 결과에서 누락됩니다. 문자열 전체도 부분 문자열에 포함하려면 위 예제처럼 i <= str.Length로 조건을 설정해야 합니다.
실행 결과
p
q
r
pq
qr
pqr
이처럼 중첩 반복문과 Substring() 메서드만으로도 문자열의 모든 부분 문자열을 간단하게 출력할 수 있습니다. 문자열 길이가 n일 때 부분 문자열의 총 개수는 n × (n + 1) / 2개이므로, 입력 문자열이 길어지면 성능을 고려한 최적화가 필요할 수 있습니다.