본문 바로가기
Programming/Programmers

[프로그래머스] 조이스틱(Python)

by 데이터현 2021. 10. 26.

https://programmers.co.kr/learn/courses/30/lessons/42860

 

코딩테스트 연습 - 조이스틱

조이스틱으로 알파벳 이름을 완성하세요. 맨 처음엔 A로만 이루어져 있습니다. ex) 완성해야 하는 이름이 세 글자면 AAA, 네 글자면 AAAA 조이스틱을 각 방향으로 움직이면 아래와 같습니다. ▲ - 다

programmers.co.kr

이 문제에서 구현해야 하는 로직은 두 가지다

1. 현재 커서의 알파벳에 따라 이동해야 하는 최소 커서 횟수 계산

2. 현 위치에서 커서를 왼쪽 오른쪽 중 어디로 이동해야 최소 커서 이동인지 계산

 

알파벳의 총개수는 25개이므로,

위의 12개 까지는 조이스틱을 아래로

아래 12개 까지는 조이스틱을 위로(거꾸로) 이동하면 된다.

'A'의 아스키 코드 값은 65 이므로 + 12 인 77까지는 아래로

그보다 클 때는 위로 조이스틱을 이동하도록 코드를 작성했다.

중간값인 78은 어디로 가도 똑같기 때문에 그냥 아래로 가도록 했다. 

 

다음으로 현 위치에서 커서를 왼쪽 오른쪽 중 어디로 이동해야 최소 커서 이동인지 계산하는 문제는

그냥 현 위치에서 가장 가까운 곳으로 방문하면 결국 그게 최소라는 것을 추론해야 한다.

아무튼 그래서 나는 오른쪽 왼쪽으로 한 칸씩 이동하면서

이동한 커서 위치가 변경해야 하는 코드라면 바로 커서위치를 변경해주고 반복문을 빠져나오게 된다.

def solution(name):
    # visit 리스트를 선언, 알파벳이 A가 아니면 True, A이면 False로 수정하지 않아도 됨.
    visit =[True if x !='A' else False for x in name]
    answer = 0 # 커서 이동 횟수
    index = 0 # 커서 위치
    # 수정해야 하는 알파벳이 있을 때
    while True in visit:
        # 만약 현재 커서 위치의 알파벳이 수정해야 한다면 
        if visit[index] == True:
            # 방문 처리
            visit[index] = False
            # 아스키 코드 값 활용
            joy_count = ord(name[index])
            answer += joy_count - 65 if joy_count <=78 else 91 -joy_count 
        else:
            right_move = index 
            left_move = index
            while True in visit:
                answer += 1
                right_move = right_move + 1 if right_move != len(visit)-1 else 0 
                left_move = left_move -1 if left_move != -(len(visit)) else -1
                if visit[right_move] == True:
                    index = right_move
                    break
                elif visit[left_move] == True:
                    index = left_move
                    break
    return answer

댓글