반응형
이 포스트에서는 프로그래밍 문제 사이트 백준 Online Judge의 3356번 : '라디오 전송', 3779번 : '주기' 문제의 풀이 코드와 해설을 다루고 있습니다.
문제 난이도는 Solved.ac 기준 Platinum 티어에 해당하며, 문제를 풀이하기 위해 문자열 탐색 알고리즘인 KMP 알고리즘에 대한 이해가 필요합니다.
3356번 : 라디오 전송
반복되어 나오는 문자열이 주어졌을 때, 가능한 가장 짧은 부분 문자열의 길이를 출력하는 문제입니다.
문자열이 반복되어 나온다는 점에서 이전에 풀이한 1305번 : '광고' 문제와 똑같습니다.
풀이 역시 위 포스트의 1305번 : '광고' 문제와 풀이와 코드가 완전히 동일합니다.
따라서 위 포스트에 정리되어 있는 1305번 : '광고' 문제의 풀이를 참고해주세요.
3779번 : 주기
문자열 S의 모든 접두사에 대해 주기문인지를 조사하고, 반복 문자열의 길이가 2 이상인 주기문인 경우 주기문의 길이와 반복 횟수를 출력하는 문제입니다.
#include <iostream>
#include <string>
#include <vector>
using namespace std;
vector<int> GetPi(string &Pattern) {
vector<int> Pi(Pattern.length());
for(int i=1, j=0; i<Pattern.length(); i++) {
while(j>0 && Pattern[i] != Pattern[j]) j = Pi[j-1];
if(Pattern[i] == Pattern[j]) Pi[i] = ++j;
}
return Pi;
}
int main() {
for(int t=1; ; t++) {
int N;
cin >> N;
if(N == 0) break;
string Str;
cin >> Str;
vector<int> Pi = GetPi(Str);
int L = Str.length();
printf("Test case #%d\n", t);
for(int i=1; i<=L; i++)
if(i%(i-Pi[i-1]) == 0 && i/(i-Pi[i-1]) > 1)
printf("%d %d\n", i, i/(i-Pi[i-1]));
printf("\n");
}
}
풀이는 위와 같으며, 문자열의 길이와 Pi 배열 값의 관계식을 이용하여 주기문의 길이와 반복 횟수를 찾을 수 있습니다.
해당 유형의 문제에 대한 그림 설명은 위의 링크에 첨부되어 있으니 참고하시면 유용할 것입니다.
반응형
'알고리즘 > 백준(BOJ) 문제풀이' 카테고리의 다른 글
[C++ 백준 풀이] 13506번 : 카멜레온 부분 문자열 (KMP) (0) | 2021.12.25 |
---|---|
[C++ 백준 풀이][Diamond II] 17441번 : 파리채 만들기 (그린 정리, Green's Theorem) (0) | 2021.12.25 |
[C++ 백준 풀이] 16900번 : 이름 정하기 / 1305번 : 광고 / 1498번 : 주기문 (KMP 응용) (0) | 2021.12.23 |
[C++ 백준 풀이] 11585번 : 속타는 저녁 메뉴 / 12104번 : 순환 순열 / 16570번 : 앞뒤가 맞는 수열 (0) | 2021.12.23 |
[C++ 백준 풀이] 7575번 : 바이러스 / 10266번 : 시계 사진들 (KMP 응용) (0) | 2021.12.23 |