SW Expert Academy 15758_무한 문자열 문제풀이 in C++
문제 URL
문제 요구사항
- 문자열 S에 대해, f(S)를 S를 무한히 반복해서 얻은 문자열이라고 정의하자. 예를 들어 f(“abcd”) = “abcdabcdabcdabcd…” 이다.
- S≠T이라도 f(S)=f(T) 일 수 있다. 예를 들어 S = “ababab”, T = “abab”라면 f(S)와 f(T) 모두 “ababababababab…”이다.
- 두 개의 문자열 S와 T가 주어질 때, f(S)=f(T)인지의 여부를 구하는 프로그램을 작성하라.
[입력]
- 첫 번째 줄에 테스트 케이스의 수 T가 주어진다.
- 각 테스트 케이스는 한 개의 줄로 이루어지며, 각 줄에는 두 개의 문자열 S와 T가 공백 하나를 사이로 두고 주어진다.
- S와 T는 알파벳 소문자(a-z)로만 구성되어 있으며, 1글자 이상 50글자 이하이다.
[출력]
- 각 테스트 케이스마다, f(S)=f(T)라면 ‘yes’를, f(S)≠f(T)라면 ‘no’를 출력한다.
접근 방법
- 입력받은 S와 T 문자열을 반복하여 각각 50길이까지 만들어주고, 두 문자열이 서로 포함 관계 혹은 같은지 확인하고 문제에서 요구하는대로 출력한다.
풀이 순서
- TC를 입력 받고, 해당 TC만큼 for문을 반복한다.
- input을 입력 받고, 공백을 기준으로 구분해 문자열 S와 T를 저장한다.
- S와 T를 문자열 길이 50이상이 되도록 반복해 만들고, 이후, 문자열 비교를 통해 문제 요구사항에 해당하는지 확인한다.
소스코드
#include <iostream>
#include <string>
using namespace std;
int main() {
ios::sync_with_stdio(false);
cin.tie(0);
cout.tie(0);
int TC;
cin >> TC;
cin.get();
for (int test_case = 1; test_case <= TC; test_case++) {
string input;
getline(cin, input, '\n');
string s = input.substr(0, input.find(' '));
string t = input.substr(input.find(' ') + 1, input.length() - 1);
int s_size = s.length();
int t_size = t.length();
while (s.length() <= 50) {
for (int i = 0; i < s_size; i++) {
s += s[i];
}
}
while (t.length() <= 50) {
for (int i = 0; i < t_size; i++) {
t += t[i];
}
}
if (s.length() > t.length()) {
if (s.find(t) == string::npos)
cout << "#" << test_case << " no\n";
else
cout << "#" << test_case << " yes\n";
}
else if (s.length() < t.length()) {
if (t.find(s) == string::npos)
cout << "#" << test_case << " no\n";
else
cout << "#" << test_case << " yes\n";
}
else {
if (s.compare(t) == 0)
cout << "#" << test_case << " yes\n";
else
cout << "#" << test_case << " no\n";
}
}
return 0;
}
문제 풀이 결과
