일 | 월 | 화 | 수 | 목 | 금 | 토 |
---|---|---|---|---|---|---|
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 | 31 |
Tags
- 머신러닝
- 다이나믹프로그래밍
- python 강의
- 프로그래밍
- dynamic programming
- 슬픔
- 파이썬 강좌
- 알고리즘
- 강의
- python 강좌
- 강좌
- python
- 백준
- C++
- 파이썬
- 자작시
- mmdetection
- 파이썬 강의
- 철학
- 2021
- 공부
- dp
- it
- 2020
- 라즈베리파이3
- 라즈베리파이
- BOJ
- 라즈베리파이 모니터
- mmcv
- 계획
Archives
- Today
- Total
Stargazer
[백준] 1305번 : 광고 (KMP 알고리즘) c++ 풀이 본문
반응형
접근:
전광판이 무한으로 연결되어서 나오는 형태의 광고이기 때문에 적어도 L 만큼은 광고 할 수 있음이 보장이 되어있다.
문제는 주어진 문자열에 대해서 어떤 광고를 말하는 것인지 최소 길이를 구하는 것이다.
문제의 예에서도 말했듯이, aabaaa 가 주어졌다면, aaba 는 광고가 가능한 최소 길이이다
중요한 것은 반복할 문자열이 그 뒤에 얼마나 겹치는 가이다.
그래서, 최소 길이를 구하려면, 길이 L 에서 최대한 겹치는 부분을 제외한 나머지 부분으로 구해야한다.
위 예로 들자면 aabaaa 처럼 뒤에 2개가, 길이 L이 주어졌을 때, 반복하면 최대로 겹치는 부분이다. 그렇기 때문에 저 2개를 제외한 나머지 부분이 반복해야 할 최소 길이가 된다.
전략:
KMP 알고리즘을 이용하여, 하나씩 길이를 늘려가면서 DP처럼 풀어내는 것이다.
이전 탐색 결과를 이용하여 얼마나 겹치는 지를 확인하면서 가기 때문에 시간 내로 풀기에 적절하다.(O(n + m) 시간 수행)
길이가 주어졌을 때의 최대로 겹치는 수를 구하고,
전체 길이에서 겹치는 수를 빼면, 꼭 포함해야 하는 문자열의 최소 길이가 된다.
구현:
#include <iostream>
#include <vector>
using namespace std;
int L;
string str;
vector<int> f;// 길이당 최대 겹치는 부분 조사
int main(){
cin >> L;
cin >> str;
f.resize(L);
for(int i=1,j=0;i<L;i++){
while(j>0 && str[i] != str[j]){ //j=0이거나 같은 문자 나올때까지 이동
j = f[j-1];
}
//만약 같은문자면 현재까지 겹치는 수 대입
if(str[i]==str[j]){
f[i] = ++j;
}
//j==0 이고 str[i] != str[j] 이면 다음줄로 넘어감
}
cout << L - f[L-1] << '\n'; //L일때 최대로 겹치는 수 제외한 나머지
return 0;
}
반응형
'Undergraudate basics(학부생 기초) > 자료구조, 알고리즘' 카테고리의 다른 글
[백준] 2239번: 스도쿠 C++ (백트래킹) (0) | 2022.07.04 |
---|---|
[백준] 1644번: 소수의 연속합 c++ 풀이 (에라토스테네스의 체, 투 포인터) (0) | 2022.06.25 |
[백준] 1202번 : 보석 도둑 (그리디 알고리즘) C++ 풀이 (0) | 2022.05.20 |
[백준] 1007번: 벡터 매칭 (수학) c++ 풀이 (0) | 2022.05.20 |
[백준] 1197번 : 최소 스패닝 트리 c++ 풀이 (0) | 2022.05.17 |
Comments