1 분 소요

[SWEA] 2007. 패턴 마디의 길이

패턴에서 반복되는 부분을 마디라고 부릅니다. 문자열을 입력 받아 마디의 길이를 출력하는 프로그램을 작성해야 합니다.

제약 사항

각 문자열의 길이는 30입니다. 마디의 최대 길이는 10입니다.


테스트 케이스

입력 출력
3
KOREAKOREAKOREAKOREAKOREAKOREA
SAMSUNGSAMSUNGSAMSUNGSAMSUNGSA
GALAXYGALAXYGALAXYGALAXYGALAXY
#1 5
#2 7
#3 6

생각해보기

문자열이 주어졌을 때 반복되는 모든 단어의 길이가 같으면 같다고 패턴이라고 생각을 하고 해당 단어의 길이를 출력합니다.

s = input()
str = ''
for i in s:
    str += i
    l = len(str)
    if str == s[l:l+l]:
        print(l)
    

이를 실행했을 때 문제가 발생합니다. 주어진 입력은 다 통과하나 만약 반복되는 문자가있는 문자열이라면 그 반복되는 문자의 개수를 출력할 것입니다.

예를 들어 PIZZAPIZZAPIZZAPIZZAPIZZAPIZZA 가 주어졌을때

패턴은 PIZZA에서도 등장하지만 위 식에서는 PIZZAPIZZA도 출력됩니다. PIZZAPIZZA 뒤에 한 번 더 반복할 수 있기 때문에 출력됩니다. 그렇다면 여기에서 찾을 수 있는 패턴은 PIZZA와 PIZZAPIZZA 두가지가 됩니다. 그리고 반복되는 단어의 길이를 출력하면 5와 10이 출력됩니다.

그렇다면 첫 번째 값을 출력하고 멈추면 될까요??

아닙니다. 위 예시로든 PIZZA의 경우 패턴으로 찾고자하는 단어를 먼저 인식하지만 만약 첫 문자가 반복되는 단어가 패턴으로 있는 문자열이라면 어떨까요?

예를 들어 SSAFY가 패턴으로 있는 문자열이 주어졌습니다. break문이 없다면 S를 먼저 출력하고 SSAFY를 출력할 것입니다.

그렇기 때문에 조건을 더 설정해 주어야합니다.

s = input()
str = ''
for i in s:
    str += i
    l = len(str)
    if str == s[l:l+l]:
        #조건 추가
        chcek = s[l:].replace(str,"") 
#감지한 단어가 패턴이라면 단어 이후에 감지한 단어를 지운다면 해당 문자열은 비워집니다. 그것을 check라고 설정한뒤
        if len(check) < len(str): 
#문자열의 길이는 30입니다.
            break
print(l)

위를 통해서 문제를 해결할 수 있습니다.

여기서 한 번 더 고민했던것이 문자열의 길이는 30입니다. 나누어 떨어지지 않는 단어의 반복이라면 뒤에 완성되지 못한 문자가 남을 것 입니다.
그렇기 때문에 == 0 이나 == False를 할 수 없고 그 단어의 길이는 아무리 길어도 패턴으로 주어진 단어보다 작기 때문에 if len(check)< len(str)을 조건으로 작성해 줍니다.

만약 반복되는 문자를 패턴으로 인지하고 조건문을 진행했다면 그 단어를 지운 문자열의 길이가 len(str)보다 길기 때문에 조건에 맞지 않습니다.

생각하는 것이 참 어렵습니다. 머릿속으로 경우의 수를 그리는 것이 참 헷갈리는 일입니다….(˘・_・˘)

카테고리:

업데이트:

댓글남기기