[SWEA] 2007. 패턴 마디의 길이
[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)보다 길기 때문에 조건에 맞지 않습니다.
생각하는 것이 참 어렵습니다. 머릿속으로 경우의 수를 그리는 것이 참 헷갈리는 일입니다….(˘・_・˘)
댓글남기기