[프로그래머스] 조이스틱

이강혁·2024년 6월 14일
0

프로그래머스

목록 보기
58/82

https://school.programmers.co.kr/learn/courses/30/lessons/42860?language=python3

예전에 못 풀었던 문제.

상하로 조이스틱 움직이는 것은 해결했으나 좌우로 움직이는 것에 대해서 답을 구하지 못했었다.

상하로 움직이기

A에서 아래로 내리면 Z로 넘어가기에 A에서 어떤 알파벳으로 가는 길이 A에서 시작하거나 Z에서 거꾸로 가는 방법이 있다.

for c in name:
	updown+=min(abs(ord('A') - ord(c)), abs(ord('Z') - ord(c)) + 1)

이렇게 아스키코드를 활용해서 거리가 더 가까운 곳을 결정하게 했다. Z는 A에서 Z가려면 1번 눌러야하기에 1을 더해줬다.

좌우로 움직이기

전제가 하나 있어야한다. 한 번 왔다갔다 하는 경우는 있어도 두 번 이상 왔다갔다 하는거는 무조건 최소보다 크다는 것. 그러니까 처음에 오른쪽방향으로 시작했다가 왼쪽방향으로 되돌아가는 것은 가능하지만 오 - 왼 - 오 - 왼 이런식으로 하는거는 고려 안 한다.

처음엔 일단 오른쪽으로 가는거를 최소값으로 둔다. 그리고 첫 index부터 시작해서 다음 index까지 가면서 중간에 A를 만나면 그 다음 A가 아닌 알파벳까지의 거리를 계산해서 A직전에서 되돌아가서 A가 아닌 알파벳까지 거꾸로가는 거리를 측정한 다음 최솟값을 찾아낸다.

또한, 처음부터 왼쪽으로 가는 경우도 생각해본다. 원점에서 A가 아닌 알파벳까지 왼쪽으로 가게되면 (len(name) - next)가 되고 두 번 가니 2를 곱한다. 그리고 나서 index까지 거리를 더하는 경우도 계산한다.

def solution(name):
    updown = 0
    
    for c in name:
        updown+=min(ord(c) - ord('A'), abs(ord('Z') - ord(c)) + 1)
    
    min_move = len(name) - 1
    
    while name[min_move] == "A" and min_move>0:
        min_move-=1
    
    for i in range(len(name)):
        next = i + 1
        while next < len(name) and name[next] == 'A':
            next += 1
        min_move = min(min_move, i + i + len(name) - next, (len(name) - next) * 2 + i)
    
    return updown + min_move
profile
사용자불량

0개의 댓글