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의 맨 왼쪽부터 마지막 전까지의 문자. >>> 실제로 문자 밀기를 해가면서 비교