[programmers] 조이스틱
로직
1. 단어를 확인하면서 A가 아니면 최소이동으로 대문자로 갈 수 있는 횟수를 구하고(count함수) 왼쪽 또는 오른쪽으로 이동한다.
2. 이동할 때, 대문자가 'A'가 나올 때까지 움직이고, right, left를 비교해서 움직인 후에 더 짧은거리를 채택한다.
이때, 1)스트레이트로 오른쪽으로 가는방법
2)오른쪽으로가다가 왼쪽으로 방향전환하는 방법
두가지가 있다고 한다. 흠,, name = 'BBBAAAB'일때 최소가 8이라고 생각했지만, 답은 9라고한다,, 이건 문제에 오류가 있는 것이 아닐까,,
코드
주의할 점
1. left, right = 1, 1인 이유
- left, right = 0, 0이면 무한으로 돈다
- if name[idx + i] == 'A': right += 1 따라서 idx += right 할 때, A가 아닌 다음값으로 가기 위해서는 처음에 right = 1이여야 한다.
2. ** 문제점 : ['J', 'A', 'N'] (ans=0, idx=0)에서 ['A', 'A', 'N'] (ans=10, idx=-1)에서 ['A', 'A', 'A'] (ans=23)이므로 23이 답인데 26으로 나온다.
** 해결책 : ['J', 'A', 'N'] (ans=0, idx=0)에서 ['A', 'A', 'N'] (ans=10, idx=-1)에서 ['A', 'A', 'A'] (ans=23) 에서
if name == ['A'] * len(name): 에서 멈춰야하는데, while True: 바로밑에있으면 밑에 있는 while문을 한번 더 돈 다음에
break되어 답이 26으로 나온다. 따라서, 'A'로 바꾼다음에 if name == ['A'] * len(name):을하면 된다.
3. 테케 11번이 자꾸 틀린다. -> [left, right 비교하는 방법]
1) 스트레이트로 오른쪽으로 가는방법
2) 오른쪽으로가다가 왼쪽으로 방향전환하는 방법 -> if left == right:이면 right로 가야한다.