일 | 월 | 화 | 수 | 목 | 금 | 토 |
---|---|---|---|---|---|---|
1 | 2 | 3 | 4 | 5 | 6 | |
7 | 8 | 9 | 10 | 11 | 12 | 13 |
14 | 15 | 16 | 17 | 18 | 19 | 20 |
21 | 22 | 23 | 24 | 25 | 26 | 27 |
28 | 29 | 30 |
Tags
- Computer Science
- D2
- 데이터베이스
- SW Expert Academy
- 네트워크
- algorithm
- data structure
- BOJ
- 법의학
- 운영체제
- Database
- D3
- LeetCode
- c++
- 자료구조
- 독서
- cs
- Programmers
- 백준
- OS
- 감상문
- 프로그래머스
- 문제풀이
- network
- algogritim
- 재테크/투자
- swea
- db
- language
- 알고리즘
Archives
- Today
- Total
선택은 나의 것
[BOJ 백준] 1786번 찾기 본문
문제
BOJ 1786 : https://www.acmicpc.net/problem/1786
1786번: 찾기
첫째 줄에, T 중간에 P가 몇 번 나타나는지를 나타내는 음이 아닌 정수를 출력한다. 둘째 줄에는 P가 나타나는 위치를 차례대로 출력한다. 예컨대, T의 i~i+m-1번 문자와 P의 1~m번 문자가 차례로 �
www.acmicpc.net
접근
정석으로 KMP 알고리즘을 사용하여 풀이를 요구하는 문제이다.
KMP알고리즘에 관한 건 이전에 풀었던 문제인 [BOJ 백준] 1305번 광고 포스팅을 참고하시길 바란다.
코드
#include <iostream>
#include <string>
#include <vector>
using namespace std;
int main() {
string t, p;
getline(cin, t);
getline(cin, p);
vector<int> fail(p.size(), 0), answer;
for (int i = 1, j = 0; i < p.size(); i++) {
while(j > 0 && p[i] != p[j])
j = fail[j - 1];
if (p[i] == p[j])
fail[i] = ++j;
}
for (int i = 0, j = 0; i < t.size(); i++) {
while(j > 0 && t[i] != p[j])
j = fail[j - 1];
if (t[i] == p[j]) {
if (j == p.size() - 1) {
answer.push_back(i + 1 - j);
j = fail[j];
}
else j++;
}
}
cout<<answer.size()<<"\n";
for (int i = 0; i < answer.size(); i++) {
cout<<answer[i]<<" ";
}
return 0;
}
'☽ Algorithm > BOJ' 카테고리의 다른 글
[BOJ 백준] 2812번 크게 만들기 (0) | 2020.07.22 |
---|---|
[BOJ 백준] 9370번 미확인 도착지 (0) | 2020.07.16 |
[BOJ 백준] 1456번 거의 소수 (0) | 2020.07.10 |
[BOJ 백준] 2841번 외계인의 기타 연주 (0) | 2020.07.10 |
[BOJ 백준] 7568번 덩치 (0) | 2020.07.08 |
Comments