728x90
반응형
문제 링크
https://school.programmers.co.kr/learn/courses/30/lessons/42860
문제 설명
조이스틱으로 알파벳 이름을 완성하세요. 맨 처음엔 A로만 이루어져 있습니다.
ex) 완성해야 하는 이름이 세 글자면 AAA, 네 글자면 AAAA
조이스틱을 각 방향으로 움직이면 아래와 같습니다.
▲ - 다음 알파벳
▼ - 이전 알파벳 (A에서 아래쪽으로 이동하면 Z로)
◀ - 커서를 왼쪽으로 이동 (첫 번째 위치에서 왼쪽으로 이동하면 마지막 문자에 커서)
▶ - 커서를 오른쪽으로 이동 (마지막 위치에서 오른쪽으로 이동하면 첫 번째 문자에 커서)
예를 들어 아래의 방법으로 "JAZ"를 만들 수 있습니다.
- 첫 번째 위치에서 조이스틱을 위로 9번 조작하여 J를 완성합니다.
- 조이스틱을 왼쪽으로 1번 조작하여 커서를 마지막 문자 위치로 이동시킵니다.
- 마지막 위치에서 조이스틱을 아래로 1번 조작하여 Z를 완성합니다.
따라서 11번 이동시켜 "JAZ"를 만들 수 있고, 이때가 최소 이동입니다.
만들고자 하는 이름 name이 매개변수로 주어질 때, 이름에 대해 조이스틱 조작 횟수의 최솟값을 return 하도록 solution 함수를 만드세요.
제한사항
- name은 알파벳 대문자로만 이루어져 있습니다.
- name의 길이는 1 이상 20 이하입니다.
입출력 예
name | return |
"JEROEN" | 56 |
"JAN" | 23 |
풀이 과정
- DFS로 해결
- 최소를 구하는 것이니 값이 갱신중이던 answer보다 크면 pruning
- 문자열이 다 완성되면 값 갱신하면서 return
- 그리디로 풀면 예외가 생기는 것 같음 (
그리디라고 안적혀있었으면 진작 dfs로 풀었을듯?...)
정답
answer = 1e9
def solution(name):
global answer
n = len(name)
name = list(name)
def dfs(now, target, value):
global answer
if value > answer:
return
if target == name:
answer = min(answer, value)
return
sub = []
for idx, t in enumerate(target):
if t != name[idx]:
sub.append(idx)
# 조작하기
for next_idx in sub:
target[next_idx] = name[next_idx]
next_value_1 = min(abs(now - next_idx), n - abs(now - next_idx))
next_value_2 = min(abs(int(ord(name[next_idx])) - 65), 26 - abs(abs(int(ord(name[next_idx])) - 65)))
dfs(next_idx, target, value + next_value_1 + next_value_2)
target[next_idx] = 'A'
dfs(0, ["A" for _ in range(n)], 0)
return answer
728x90
반응형
'Problem Solving > 프로그래머스' 카테고리의 다른 글
순위 - 파이썬(Python) (0) | 2023.10.31 |
---|---|
코딩 테스트 공부 - 파이썬(Python) (0) | 2023.10.30 |
풍선 터트리기 - 파이썬(Python) (1) | 2023.08.29 |
쿼드압축 후 개수 세기 - 파이썬(Python) (0) | 2023.08.25 |
아이템 줍기 - 파이썬(Python) (0) | 2023.08.24 |