본문 바로가기

코테 공부/python

Python 문자열 밀기

https://school.programmers.co.kr/learn/courses/30/lessons/120921

내코드

나는.. 구현에는 충실해...

def solution(A, B):
    answer = -1
    for i in range(0, len(A)):
        if A[len(A)-i:] + A[:len(A)-i] == B:
            return i
    return answer

 

기똥찬 코드

냅다 두번 연결시키면 그 안에 순환되는 모든 문자열은 포함되었을 테니

거기서 찾는 문자열의 인덱스를 find로 찾고 없으면 원래도 -1 반환되니 그대로 answer 가져가면 되고

0일경우 A와 B가 같으니까 그냥 두고

0보다 클 경우 해당 인덱스가 문자열 인덱스 0 자리에 오려면

{(문자열 전체길이+1) 번째 - (해당 idx + 1) 번째} 만큼 가야하므로 len(A) - idx 가 되는데 여기서 idx는 answer이므로

def solution(A, B):

    AA = A+A
    answer = AA.find(B)

    if answer > 0:
        answer = len(A) - answer

    return answer

 

반전

라고 신명나게 풀이했는데 통과 안되는 풀이였는데..?

아 뒤에도 문자열이 반복되면

ex)

A = 'atat'

B = 'tata'

result = 1

이런 식이면 find 가 처음 나오는 인덱스라서 문제가 되는거 같은데..

뒤에서 같은 문자열이 나오면 그게 더 최소 횟수로 밀어서 완성 될 수 있으니까!

그래서 len(A) - 1 인덱스부터 -1 해가면서 뒤에서부터 찾는 포문을 넣으니 해결이 되었다

근데 이렇게 할꺼면 굳이......

분명 다른 방법이 있는데 내가 또 for문을 돌린걸까

def solution(A, B):
    
    doubleA = A+A
    print(doubleA)
    answer = -1
 
#추가한 부분
    for i in range(1, len(A)):
        idx = doubleA.find(B, len(A) - i)
        if idx != -1:
            answer = idx
            break
#여기까지

    print(answer)
    if answer > 0:
        answer = len(A) - answer
        
    return answer

돌아는 갓댜..