풀이
def solution(name):
answer = len(name) - 1
for i in range(0, len(name)):
nameASCII = ord(name[i])
if nameASCII > 78:
answer += (90 - nameASCII + 1)
else:
answer += (13 - 78 + nameASCII)
lenOfFrontA = 0
for i in range(1, len(name)):
if name[i] == 'A':
lenOfFrontA += 1
if name[i] != 'A':
break
lenOfBackA = 0
for i in range(len(name) - 1, -1, -1):
if name[i] == 'A':
lenOfBackA += 1
if name[i] != 'A':
break
return answer - max(lenOfFrontA, lenOfBackA)
첫번째 포문에서 알파벳을 변경하는 조작횟수를 계산하고 두 번째, 세 번째 포문에서 연속되는 a만큼의 자리 이동 조작 횟수를 빼려고 했다.
근데 자꾸 11번째 케이스에서 실패했다. 검색해보니 ABABAAAAABA 의 경우에서 통과해야한다고 한다.
내 코드는 탐욕법을 적용하고 있지 않아 전면적으로 수정해야 했다. 잘 떠오르지 않아 다른분의 코드를 봤다.
처음엔 로직만 참고하려고 했는데, 내가 짜니 코드가 길어지고 조건문이 더러워져서 결국 거의 다 따라했다.
로직도 문법 활용도 좋아서 깔끔한 코드였다. 언제쯤 나도 이렇게 짤 수 있을가..,,
참고한 블로그: whwl.tistory.com/93
def solution(name):
change = [min(ord(name[i]) - ord('A'), ord('Z') - ord(name[i]) + 1) for i in range(len(name))]
idx = 0
answer = 0
while True:
answer += change[idx]
change[idx] = 0
if sum(change) == 0:
break
left, right = 1, 1
while change[idx - left] == 0:
left += 1
while change[idx + right] == 0:
right += 1
answer += left if left < right else right
idx += -left if left < right else right
return answer
'알고리즘 스터디' 카테고리의 다른 글
[프로그래머스] 스택/큐 1. 다리를 지나는 트럭 (0) | 2021.02.28 |
---|---|
[프로그래머스] 탐욕법 3. 큰 수 만들기 (0) | 2021.02.24 |
[프로그래머스] 이분탐색 1. 입국심사 (0) | 2021.02.21 |
[프로그래머스] 깊이/너비우선탐색 1. 타겟 넘버 (0) | 2021.02.15 |
[프로그래머스] 힙 1. 더 맵게 (0) | 2021.02.10 |