알고리즘/백준

[백준 알고리즘] 11478번: 서로 다른 부분 문자열의 개수 (파이썬 / Python)

gyujh 2022. 8. 11. 17:49
문제

문자열 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번: 서로 다른 부분 문자열의 개수

import sys

s = sys.stdin.readline().rstrip()
s_set = set()
for i in range(len(s)):
    for j in range(len(s)):
        s_set.add(s[i : j+1])
print(len(s_set)-1)

집합인 s_set을 하나 만들고 이중포문을 통해 가능한 부분 문자열들이 모두 추가시켰다.

slice를 사용했는데, [i : j+1] 와 같이 표현하면 모든 부분 문자열을 표현할 수 있다.

slice로 표현할 경우, 가능한 index값을 넘어설 경우에도 에러가 나지 않는다.

예를 들면, a = [1, 2, 3] 일때 a[:5] 와 같은 호출이 가능하다는 것이다.

따라서 모든 경우의 수를 다 추가할 수 있고, 집합이기에 중복된 항목은 제거된다.

반복문이 끝나고 집합의 길이에 -1 한 값이 답이 된다. (빈 문자열('')의 경우를 제거)


 

 

 

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

첫째 줄에 문자열 S가 주어진다. S는 알파벳 소문자로만 이루어져 있고, 길이는 1,000 이하이다.

www.acmicpc.net