알고리즘 문제/백준
백준 16916번: 부분 문자열 python 풀이 및 정답 코드
디제이망고
2021. 11. 13. 22:48
문제 링크
https://www.acmicpc.net/problem/16916
16916번: 부분 문자열
첫째 줄에 문자열 S, 둘째 줄에 문자열 P가 주어진다. 두 문자열은 빈 문자열이 아니며, 길이는 100만을 넘지 않는다. 또, 알파벳 소문자로만 이루어져 있다.
www.acmicpc.net
문제 설명
문자열 S의 부분 문자열이란, 문자열의 연속된 일부를 의미한다.
예를 들어, "aek", "joo", "ekj"는 "baekjoon"의 부분 문자열이고, "bak", "p", "oone"는 부분 문자열이 아니다.
문자열 S와 P가 주어졌을 때, P가 S의 부분 문자열인지 아닌지 알아보자.
문제 풀이
처음엔 단순히 문자열 검사로 풀려고 했으나... 시간 초과가 떴다 당연함 골드임
그래서 찾아봤더니 KMP 알고리즘으로 필요없는 곳의 탐색은 건너뛰어야 한다고 한다.
거의 베끼다싶이 해서 풀음...
코드
def make_table():
length = len(p)
table = [0] * len(p)
j = 0
for i in range(1, length):
while j > 0 and p[i] != p[j]:
j = table[j - 1]
if p[i] == p[j]:
j += 1
table[i] = j
return table
def kmp():
table = make_table()
j = 0
for i in range(len(s)):
while j > 0 and s[i] != p[j]:
j = table[j - 1]
if s[i] == p[j]:
if j == len(p) - 1:
return True
else:
j += 1
return False
s = input()
p = input()
print(1 if kmp() else 0)
결과
다른 사람의 코드
리뷰