백준 알고리즘

백준 11478번 서로 다른 부분 문자열의 개수 문제풀이, 파이썬

고인호 2023. 3. 11. 12:58
반응형

백준 11478번 : 서로 다른 부분 문자열의 개수 문제풀이 [파이썬] 


<문제>

 

11478번 문제의 내용은 아래와 같습니다. 

 

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

문제

문자열 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의 서로 다른 부분 문자열의 개수를 출력한다.

예제 입력 1 복사

ababc

예제 출력 1 복사

12

 

 

<작성한 코드>

 

#서로 다른 부분 문자열의 개수
S = input()
ans = set()
for i in range(len(S)):
  for j in range(i, len(S)):
    new = S[i:j+1]
    ans.add(new)
print(len(ans))

 

 

<코드 풀이>

ababc의 부분 문자열은 a, b, a, b, c, ab, ba, ab, bc, aba, bab, abc, abab, babc, ababc가 있고, 서로 다른것의 개수는 12개이다.

위처럼 문제를 살펴보면 서로 다른 부분 문자열이라는 것이

무슨 뜻인가에 대한 설명이 나와있다. 

결국 우리는 여러 부분 문자열들을 뽑아내고, 서로 다른 것의 개수를 세어야하기때문에

list 자료형이 아닌 set 집합 자료형을 사용해야한다. 

 

S = input()
ans = set()

위처럼 전체 문자열은 input()을 통해 입력받고, 

ans라는 이름의 변수를 가진 집합 자료형을 선언해주었다. 

 

 

for i in range(len(S)):
  for j in range(i, len(S)):
    new = S[i:j+1]
    ans.add(new)

다음으로는 위처럼 이중 반복문을 돌면서 입력받은 문자열을 슬라이스하여 

부분 문자열들을 구해내고, ans라는 집합 자료형에 추가해주었다. 

예시)

i : 0 일때 반복문을 돌면서

S[0:1], S[0:2] .... S[0:6] 들을 new라는 변수에 할당하고 

ans 자료형에 추가됨

i :1 일때역시 반복문을 돌면서

S[1:2], S[1:3], ... S[1:6]들이 new 변수에 할당되고 자료형에 추가됨

 

 

print(len(ans))

마지막으로는 위처럼 추가한 ans 집합 자료형에 len()을 사용해

저장된 원소들의 개수를 출력해주면 끝

반응형