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

Loopy·2021년 7월 10일
2

프로그래머스

목록 보기
12/32
post-thumbnail

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


🧐 문제 설명


👏 다른 사람의 풀이

조이스틱의 상하 버튼 이동 횟수는 쉬운데 좌우 버튼을 어떻게 하면 최소화해서 움직일 수 있을지를 해결하지 못해 다른 사람의 풀이를 참고했다ㅠㅠ
우선 내가 잘못 생각하여 실패한 부분은 크게 두 가지다.

  1. 좌우 버튼 이동 횟수를 처리하기 위해서 시작점(idx=0)에서 오른쪽, 혹은 왼쪽 한 방향으로만 움직이는 것 중 최소가 나올거라고 생각했다.

→ 'JAPAN' 이라는 예시가 있다고 하면, J 시작 idx 위치에서 오른쪽으로만 가면 A를 2번 만나고, 왼쪽으로 가면 2번째 idx에 위치한 A를 만나지 않고 A를 총 1번만 만나서 왼쪽 버튼을 계속 선택하는 것이 최소 횟수라고 생각했다. 왜냐하면, 다음 인덱스에 A가 있을 때 마다 방향을 바꾸면 그건 최소가 될 수 없다고 생각했기 때문이다.

→ 그런데, 'ABAAAAABB' 같은 테스트 케이스에서는 나의 생각이 적용되지 않았다. A 시작 idx 위치에서 오른쪽 방향으로 가면 A를 5번 만나고 왼쪽 방향으로 가도 A를 5번이나 만난다. 하지만 만약 2번째 idx 위치까지만 오른쪽 버튼을 누르고 이후 왼쪽 버튼을 누르면 A를 단 1번만 만나는 최소 이동 횟수가 나온다.

즉, 좌우 방향은 고정적인 것이 아니라, 좌우 방향에 따라 임의로 A를 만날 때 마다 left, right를 각각 count 해주고 더 작은 값을 선택해서 idx도 바꿔줘야 한다.

  1. 맨 오른쪽 위치에서 오른쪽 버튼을 누르면 시작점으로 돌아온다고 착각했다.

→ 문제를 잘 읽지 않아서 일어난 문제다. 1번의 착각과 합쳐져서 방향을 제어하는데 혼동이 왔다. 시작점에서 왼쪽 버튼을 눌러서 idx가 끝점으로 갔다면 얘는 왼쪽 버튼만 계속 누르는 경로로 가야지, 오른쪽 버튼을 눌러서 다시 시작점으로 돌아갈 순 없다.

시작점에서 왼쪽 버튼을 누르면 끝점으로 가지만, 끝점에서 오른쪽 버튼을 누른다고 해서 시작점으로 가는 것은 아니다.

def solution(name):
    answer = 0
    up_down = [min(ord(i)-ord('A'), ord('Z')-ord(i)+1) for i in name] # 조이스틱 상하버튼 옮기는 최소횟수
    idx = 0
    
    print(up_down)
    while True:
        answer += up_down[idx]
        up_down[idx] = 0
        if sum(up_down) == 0:   #더 이상 조이스틱 조작할 필요X
            break
        
        left,right = 1, 1
        
        while min_name[idx - left] == 0:    # left, right 각각의 값을 비교해서 0이면 1 증가시킴
            left += 1                       # 결과적으로 작은 값으로 이동하게 제어(0을 적게 만나게)
        while min_name[idx + right] == 0:
            right += 1
        
        answer += left if left < right else right
        idx += -left if left < right else right
        
    return answer

🥇 Today I Learn

ASCII Code in Python

  • ord(문자) : 문자에 해당하는 아스키 코드의 숫자를 반환
print(ord('A'))
#65
print(ord('d'))
#100
print(ord('~'))
#126
  • chr(숫자) : 숫자에 해당하는 아스키 코드의 문자를 반환
print(chr(65))
#A
print(chr(100))
#d
print(chr(126))
#~

profile
공부 쫌 해!!!😂

0개의 댓글