728x90
programmers.co.kr/learn/courses/30/lessons/42860
접근
최소한의 조작으로 입력된 문자열로 변경해야한다.
조작은 문자열 변경을 위해 위, 아래로의 조작과 바꿀 문자열의 위치로 이동하는 왼쪽, 오른쪽의 조작이 있다.
이를 최소로 하기위해서는 바꿔야하는 문자에서 A와 Z까지의 거리 중 최소를 구하고
현재 위치에서 왼쪽과 오른쪽으로 갈 때의 최소를 구하도록 한다.
구현
- 먼저 changed_name에 위, 아래로 변경 했을 때 최소 조작 횟수를 넣어준다.
- 반복문을 통해 changed_name의 합이 0이 되었을 때 종료한다.
- 현재 idx의 수를 answer에 저장하고 이동할 위치를 찾는다.
- 왼쪽과 오른쪽의 이동횟수를 1로 초기화하여 변경해야하는 위치를 찾는다.
- 이동 후에 left와 right를 비교하고 최솟값을 answer에 저장하고 idx를 업데이트한다.
def solution(name):
answer = 0
idx = 0
# 입력받은 name의 각 위치에는 위, 아래 중 최소로 이동한 횟수가 담겨있다.
changed_name = [min(ord(c)-ord('A'), ord('Z')-ord(c)+1) for c in name]
while True:
# 현재 위치에 해당하는 수를 최종해에 더한다.
answer += changed_name[idx]
# 변경했다면 그 자리를 0으로 만들어주고
changed_name[idx] = 0
# 모두 0이 되었을 때는 문자열 변경을 완료한 것이다.
if sum(changed_name) == 0:
break
# 왼쪽과 오른쪽으로 이동해야한다.
# 일단 이동횟수를 1부터 시작
left = right = 1
# 0이 나오지 않을 때까지 이동
while changed_name[idx - left] == 0:
left += 1
while changed_name[idx + right] == 0:
right += 1
# 왼쪽과 오른쪽 중 최소 이동횟수를 더해주고
# 현재 위치를 옮긴다.
if left < right:
answer += left
idx += (-left)
else:
answer += right
idx += right
return answer
'알고리즘 풀이 > 프로그래머스' 카테고리의 다른 글
[Level 2] 스킬트리 (0) | 2021.03.22 |
---|---|
[Level 3] 거스름돈 (0) | 2021.03.17 |
[Level 3] 단속카메라 (0) | 2021.03.08 |
[Level 2] JadenCase 문자열 만들기 (0) | 2021.03.08 |
[Level 3] 멀리 뛰기 (0) | 2021.03.06 |