[프로그래머스] LEVEL2 조이스틱 (Python)
🧐 문제 설명
👏 다른 사람의 풀이
조이스틱의 상하 버튼 이동 횟수는 쉬운데 좌우 버튼을 어떻게 하면 최소화해서 움직일 수 있을지를 해결하지 못해 다른 사람의 풀이를 참고했다ㅠㅠ
우선 내가 잘못 생각하여 실패한 부분은 크게 두 가지다.
- 좌우 버튼 이동 횟수를 처리하기 위해서 시작점(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번의 착각과 합쳐져서 방향을 제어하는데 혼동이 왔다. 시작점에서 왼쪽 버튼을 눌러서 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))
#~
Author And Source
이 문제에 관하여([프로그래머스] LEVEL2 조이스틱 (Python)), 우리는 이곳에서 더 많은 자료를 발견하고 링크를 클릭하여 보았다 https://velog.io/@sem/프로그래머스-LEVEL2-조이스틱-Python저자 귀속: 원작자 정보가 원작자 URL에 포함되어 있으며 저작권은 원작자 소유입니다.
우수한 개발자 콘텐츠 발견에 전념 (Collection and Share based on the CC Protocol.)