BOJ Code/Platinum

[백준/BOJ] platinum5 - 4354번 문자열 제곱 (Python)

NIMHO 2022. 4. 8. 02:16
728x90

▶4354 - 문자열 제곱

문제

알파벳 소문자로 이루어진 두 문자열 a와 b가 주어졌을 때, a*b는 두 문자열을 이어붙이는 것을 뜻한다. 예를 들어, a="abc", b="def"일 때, a*b="abcdef"이다.

이러한 이어 붙이는 것을 곱셈으로 생각한다면, 음이 아닌 정수의 제곱도 정의할 수 있다.

  • a^0 = "" (빈 문자열)
  • a^(n+1) = a*(a^n)

문자열 s가 주어졌을 때, 어떤 문자열 a에 대해서 s=a^n을 만족하는 가장 큰 n을 찾는 프로그램을 작성하시오.

 

입력

입력은 10개 이하의 테스트 케이스로 이루어져 있다. 각각의 테스트 케이스는 s를 포함한 한 줄로 이루어져 있다. s의 길이는 적어도 1이며, 백만글자를 넘지 않는다. 마지막 테스트 케이스의 다음 줄은 마침표이다.

 

출력

각각의 테스트 케이스에 대해, s=a^n을 만족하는 가장 큰 n을 찾은 뒤 출력한다.

 

풀이

이 문제는 나름 플레5 문제지만 그래도 쉽게 풀었던거 같다.

그냥 반복되는 문자열을 찾아서 몇 제곱인지 출력해주면 되는 문제였다.

이번에도 python으로 풀었다.

학교에선 자바, c언어를 다루는데 백준을 python으로 풀다보니 이게 더 편해진거같다ㅎㅎ

게다가 내장함수가 많은게 장점!!!

 

while문을 사용해서 '.'을 받아올때 까지 input을 해주면 된다.

input이 몇 제곱인지 각각 출력해주면 끝!!

 

정답은 맞았지만 문제를 푸는데 오래 걸리기도 했고, 이해하는데도 오래걸렸다...ㅜ

파이썬이라서 그나마 빨리 푼듯... 다음에 c로 재도전 해야겠다.

아무튼 다른사람들의 코드도 보니 나랑은 다들 다르게 풀었다.

KMP뭐시기의 실패함수 뭐시기를 사용해서 풀었다고 한다...

(모르겠어...😥)

이 부분은 더 공부해봐야할거 같다

 

def repeat(sentence):
    x = len(sentence)
    for i in range(1, (x // 2)+1):
        if x % i == 0:
            s = sentence[0:i]
            count = int(x / i)
            if s * count == sentence:
                return count
    return 1


while True:
    a = input()
    if a == ".":
        break
    print(repeat(a))
728x90