12871 무한문자열
간단한 문자열 문제
두 문자열을 각각 무한번 붙였을때
두 문자열이 같은 문자열을 만드는지 체크하는 문제
https://www.acmicpc.net/problem/12871
1. 문제
간단 설명
문자열 s와 t가 있을 때
문자열 s를 무한번 반복시킨 f(s)와
문자열 t를 무한번 반복시킨 f(t)가 같은 문자열을 만드는지 확인하는 문제
2. 문제 분석
주의점
- 무한번 문자열을 반복시키는건 불가능하므로, 언제까지 문자열을 붙일것인지 정하는것이 중요
필요변수
문자열 s, t
최대 50글자, 알파벳 소문자로만 이루어짐
무한번 붙인 문자열 f_s, f_t
알고리즘
1
2
3
4
1. 문자열 s와 t를 입력받는다
2. 문자열 s와 t의 길이를 구해 두 수의 최소 공배수를 구한다
3. 최소공배수만큼 문자열을 늘린다. 문자열의 수를 일치시킴
4. f_s와 f_t가 일치하는지 확인후 출력
3. 소스코드
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
32
33
34
#include <iostream>
#include <string>
#include <algorithm>
#include <numeric> // C++ 17 부터 추가된 numeric 라이브러리의 최소공배수 함수인 LCM 이용
using namespace std;
bool CheckString(string s, string t) {
int lcm_num = lcm(s.size(),t.size()); // 직접 구해도 되지만 LCM 함수를 이용해봄
string f_s, f_t;
for (int i = 0; i < lcm_num / s.size(); i++) // 몇번 더해줘야 최소공배수 일치될지
f_s += s;
for (int i = 0; i < lcm_num / t.size(); i++)
f_t += t;
if (f_s == f_t) {
return 1;
}
return 0;
}
int main() {
freopen_s(new FILE*, "input.txt", "r", stdin);
string s, t;
cin >> s >> t;
cout << CheckString(s, t);
return 0;
}
무한번을 늘리는것은 불가능하므로
언제까지 늘릴지를 결정하는것이 문제 해결의 핵심
이 기사는 저작권자의 CC BY 4.0 라이센스를 따릅니다.