BAEKJOON Online Judge(BOJ) 문제입니다.
Baekjoon Online Judge
Baekjoon Online Judge 프로그래밍 문제를 풀고 온라인으로 채점받을 수 있는 곳입니다.
www.acmicpc.net
문제
https://www.acmicpc.net/problem/1786
1786번: 찾기
첫째 줄에, T 중간에 P가 몇 번 나타나는지를 나타내는 음이 아닌 정수를 출력한다. 둘째 줄에는 P가 나타나는 위치를 차례대로 공백으로 구분해 출력한다. 예컨대, T의 i~i+m-1번 문자와 P의 1~m
www.acmicpc.net
내가 작성한 코드
import sys
read = sys.stdin.readline
def get_data():
T = read().rstrip()
P = read().rstrip()
return T, P
def get_pi(p):
m = len(p)
pi = [0] * m
j = 0
for i in range(1, m):
while j > 0 and p[i] != p[j]:
j = pi[j-1]
if p[i] == p[j]:
j += 1
pi[i] = j
return pi
def kmp(s, p):
n, m = len(s), len(p)
pi = get_pi(p)
ans = []
j = 0
for i in range(n):
while j > 0 and s[i] != p[j]:
j = pi[j-1]
if s[i] == p[j]:
if j == m-1:
ans.append(i-m+1)
j = pi[j]
else:
j += 1
return ans
T, P = get_data()
ans = kmp(T, P)
print(len(ans))
for i in ans:
print(i+1)
- KMP 알고리즘
- KMP 알고리즘으로 바로 풀 수 있는 문제
- KMP 알고리즘에 대해 이해하는 것이 중요함
- 아래 블로그에서 매우 자세히 설명해주심
https://bowbowbow.tistory.com/6
KMP : 문자열 검색 알고리즘
문자열 검색이 뭐지? 워드프로세서를 사용할 때 찾기 기능을 사용한적 있을 겁니다. 브라우저에서도 Ctrl+F 단축키를 눌러 검색할 수 있습니다. 아래 이미지는 브라우저에서 "테이프"를 검색했
bowbowbow.tistory.com
다른 사람이 작성한 코드
def make_pi():
pi = [0 for i in range(0, len(P))]
j = 0
for i in range(1, len(P)):
while j > 0 and P[i] != P[j]:
j = pi[j - 1]
if (P[i] == P[j]):
j += 1
pi[i] = j
return pi
def solution(pi):
result = []
count = 0
j = 0
for i in range(0, len(T)):
while j > 0 and T[i] != P[j]:
j = pi[j - 1]
if T[i] == P[j]:
if j == (len(P) - 1):
result.append(i - len(P) + 2)
count += 1
j = pi[j]
else:
j += 1
print(count)
for element in result:
print(element)
T = input()
P = input()
solution(make_pi())
- 대부분 일치하는 코드다
https://donghak-dev.tistory.com/60
[알고리즘][Python] 백준 1786 찾기 문제 풀이
문제 출처 : www.acmicpc.net/problem/1786 1786번: 찾기 첫째 줄에, T 중간에 P가 몇 번 나타나는지를 나타내는 음이 아닌 정수를 출력한다. 둘째 줄에는 P가 나타나는 위치를 차례대로 공백으로 구분해 출
donghak-dev.tistory.com
기억해야할 것
- KMP 알고리즘의 이해
- 알고리즘 코드만 보면 쉽게 해결할 수 있음
- 그러나 알고리즘을 정확하게 이해하는 것이 중요함
'코딩테스트' 카테고리의 다른 글
[코딩테스트] 프로그래머스 카카오 코딩테스트 기출 복기2 (0) | 2022.03.10 |
---|---|
[코딩테스트] 프로그래머스 카카오 코딩테스트 기출 복기1 (0) | 2022.03.10 |
[백준][최대유량] 도시 왕복하기1 (0) | 2022.03.03 |
[백준][구현] 큐빙 (0) | 2022.02.17 |
[백준][구현] 낚시왕 (0) | 2022.02.17 |