Test/Python(20220101~)

프로그래머스.L0.문자열밀기

kiostory 2022. 10. 5. 21:56

문제 설명

문자열 "hello"에서 각 문자를 오른쪽으로 한 칸씩 밀고 마지막 문자는 맨 앞으로 이동시키면 "ohell"이 됩니다. 이것을 문자열을 민다고 정의한다면 문자열 A와 B가 매개변수로 주어질 때, A를 밀어서 B가 될 수 있다면 몇 번 밀어야 하는지 횟수를 return하고 밀어서 B가 될 수 없으면 -1을 return 하도록 solution 함수를 완성해보세요.


제한사항
  • 0 < A의 길이 = B의 길이 < 100
  • A, B는 알파벳 소문자로 이루어져 있습니다.

 

입출력 예
A : B : result
"hello" "ohell" 1
"apple" "elppa" -1

 

* 첫 번째 생각

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

한 놈만 찾자, 그 놈을 Shift한 횟수로 생각...

정확성 테스트
테스트 1 〉 실패 (0.00ms, 10.1MB)
테스트 2 통과 (0.01ms, 10.1MB)
테스트 3 〉 실패 (0.01ms, 10.1MB)
테스트 4 〉 실패 (0.01ms, 10.1MB)
테스트 5 통과 (0.00ms, 10MB)
테스트 6 통과 (0.00ms, 10.1MB)
테스트 7 통과 (0.01ms, 10.1MB)
채점 결과
정확성: 57.1
합계: 57.1 / 100.0
중복된 알파벳이 있을 수 있다는 생각을 하지 않았음
 
 

* 두 번째 생각

def solution(A, B):
    answer = -1
    shift = 0
    
    for i in range(len(A)):
        for j in range(len(B)):
            if A[i] == B[j]:
                shift = j - i
                count = 0
                for k in range(len(A)):
                    if A[k] == B[(shift+k)%len(A)]:
                        count += 1           
                    else:
                        break
                if count == len(A):
                    return shift
    return answer

A문자열의 알파벳 하나하나를 B문자열 글자와 비교  -  중복 for문

A의 i번째 알파벳이 B의 j번째 알파벳과 같으면, 일단 그 값을 shift 값으로 저장하고 검증을 시작

shift만큼 밀어낸 알파벳이 모두 일치하면(count == len(A)), shift로 저장한 숫자가 정답이 맞고,

알파벳이 하나라도 일치하지 않으면 break하고 B문자열의 다음 알파벳을 비교함.

 

실행 결과
같은 코드로 채점한 결과가 있습니다.
정확성 테스트
테스트 1 통과 (0.01ms, 10.1MB)
테스트 2 통과 (0.01ms, 10.2MB)
테스트 3 통과 (0.01ms, 10.3MB)
테스트 4 통과 (0.01ms, 10.1MB)
테스트 5 통과 (0.01ms, 10.1MB)
테스트 6 통과 (0.04ms, 10.2MB)
테스트 7 통과 (0.01ms, 10.3MB)

 

* 세 번째 생각

    - 문자열 처리에 대해 좀 찾아 본 후...

 

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

A의 맨 오른쪽 [-1] 문자 + A의 맨 왼쪽부터 마지막 전까지의 문자. >>> 실제로 문자 밀기를 해가면서 비교