알고리즘

[programmers] 조이스틱

78이 2020. 9. 15. 02:09


로직

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로 가야한다.