Algorithm/programmers/greedy/level2/조이스틱 (with python)

yellow·2021년 4월 5일
0

알고리즘 문제

목록 보기
2/58

📖문제

📝풀이과정

  1. 이름에서 알파벳이 'A'가 아닌 것의 index 추리기

    • 조이스틱을 좌,우로 움직일 때의 기준은 알파벳 'A'가 아닌 것들의 위치이기 때문에, name에서 알파벳 'A'가 아닌 알파벳의 위치를 담는 리스트 notA에 담았다.
  2. 조이스틱 상,하 계산(A에서 해당 알파벳 만들기)

    • 조이스틱 조작 횟수가 최소가 되도록 해야하기 때문에 알파벳 B부터 알파벳 N까지는 조이스틱을 위로, 알파벳 O부터 알파벳 Z까지는 조이스틱을 아래로 조작하도록 했다.
    • 예시 ) 알파벳 G는 조이스틱을 위로 6번, 알파벳 V는 조이스틱을 아래로 6번 조작하는 것이 최소
  3. 조이스틱 좌,우 계산(커서 옮기기)

    • name에 있는 'A'가 아닌 알파벳들 중에서 현재 위치에서 가장 가까운 곳으로 움직이도록 한다.
      - (조이스틱을 오른쪽으로 움직일 때 가장 가까운 알파벳과의 거리와 조이스틱을 왼쪽으로 움직일 때 가장 가까운 알파벳과의 거리를 비교)
    • 만약 조이스틱을 계속 왼쪽으로 조작해서 마지막문자로 이동하는 경우가 생기면 커서를 오른쪽으로 옮기는 경우는 발생하지 않는다.(최소 조건을 만족시키지 못하기 때문) -> 변수 l로 컨트롤

⌨코드

notA : 이름에서 알파벳이 'A'가 아닌 것의 index를 담는 list
cur : name에서의 현재 커서(index)
l : 첫 번째 위치에서 조이스틱을 왼쪽으로 해서 마지막 문자로 이동했는지 여부(0 : X, 1: O)

def solution(name):
    answer = 0

    # 1. 이름에서 알파벳이 'A'가 아닌 것의 index 추리기
    notA = []
    for i in range(len(name)):
        if name[i] != 'A':
            notA.append(i)

    # 2. 조이스틱 상,하 계산(A에서 해당 알파벳 만들기)
    for c in name:
        if ord(c) < 79:
            answer += ord(c) - 65
        else:
            answer += 91 - ord(c)

    # 3. 조이스틱 좌,우 계산(커서 옮기기)
    cur = 0
    l = 0
    while 0 < len(notA):
        if cur in notA:
            notA.remove(cur)
            if len(notA) == 0:
                continue

        if l == 0:
            right = notA[0] - cur
            left = cur + len(name) - notA[len(notA) - 1]
            if left < right:
                answer += left
                cur = notA[len(notA) - 1]
                l = 1
            else:
                answer += right
                cur = notA[0]
        else:
            left = cur - notA[len(notA) - 1]
            answer += left
            cur = notA[len(notA) - 1]

    return answer

💡새로 알게된 문법

파이썬에서 문자와 아스키코드 사이 변환

  1. 문자에서 아스키코드로 변환
    ord('문자')
  2. 아스키코드에서 문자로 변환
    chr(숫자)
profile
할 수 있어! :)

0개의 댓글