문제링크) https://www.swexpertacademy.com/main/code/problem/problemDetail.do?contestProbId=AV5P1kNKAl8DFAUq
문제는 각줄마다 문장이 입력이 되는데 그 문장에서 반복마디를 구하면된다.
-입력-
KOREAKOREAKOREAKOREAKOREAKOREA
SAMSUNGSAMSUNGSAMSUNGSAMSUNGSA
GALAXYGALAXYGALAXYGALAXYGALAXY
EXOEXOEXOEXOEXOEXOEXOEXOEXOEXO
B1A4B1A4B1A4B1A4B1A4B1A4B1A4B1
APINKAPINKAPINKAPINKAPINKAPINK
BLACKPINKBLACKPINKBLACKPINKBLA
TWICETWICETWICETWICETWICETWICE
REDVELVETREDVELVETREDVELVETRED
ABCABCABCABCABCABCABCABCABCABC
-출력-
#1 5
#2 7
#3 6
#4 3
#5 4
#6 5
#7 9
#8 5
#9 9
#10 3
이문제 핵심은 반복마디가 최소로 반복되는 길이여야 한다. 맨마지막 입력예시를 보면 abcabcabcabc라서 abc가 반복이될수도있고
abcabc가 될수도있고 abcabcabc가 반복될수도 있기에 모두 정답이 될 수 있다. 하지만 출력을 보면 이 반복되는 것들 중에서도 최소의 길이를 갖는
반복패턴을 원한 것을 알 수 있었다.
반복마디의 길이가 최대 10길이여서
1~10까지의 반복마디를 각각 생성하고나자마자 만들어진 반복마디와 기존배열을 반복마디의 개수만큼 계속해서 비교해나가주었다.
그렇게되면 하나라도어긋나면 정답이 아니게되므로 자연스럽게 반대의 경우만이 정답이 된다.
소스코드)
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 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 | #include<iostream> using namespace std; int main() { int test_case; cin >> test_case; for(int t= 1; t<=test_case; t++) { char str[31]; char repeat[11]; //반복 문자열 int cnt; int j; int ret; int k; cin >> str; int len; // 반복 길이 for(len = 1; len <= 10; len++) { cnt = 0; k = 0; for(int i = 0; i<len; i++) { repeat[i] = str[i]; } for( j = len; j<30; j++) { if(cnt == len) { cnt = 0; k = 0; } if(repeat[k++]!= str[j]) { break; } cnt++; } if(j == 30) { ret = len; break; } } cout <<"#"<<t <<' '<< ret << '\n'; } } | cs |
'PS > SWEA' 카테고리의 다른 글
D1 1545번 거꾸로 출력해 보아요 (0) | 2022.05.06 |
---|---|
5986번 새샘이와 세 소수 (0) | 2018.11.03 |
1859번 백만 장자 프로젝트 (0) | 2018.10.13 |
5550번 나는 개구리로소이다 (0) | 2018.10.06 |
1926번 간단한 369게임 (0) | 2018.10.05 |