728x90
반응형
문제:
조이스틱으로 알파벳 이름을 완성하세요. 맨 처음엔 A로만 이루어져 있습니다.
ex) 완성해야 하는 이름이 세 글자면 AAA, 네 글자면 AAAA
조이스틱을 각 방향으로 움직이면 아래와 같습니다.
▲ - 다음 알파벳
▼ - 이전 알파벳(A에서 아래쪽으로 이동하면 Z로)
◀ - 커서를 왼쪽으로 이동 (첫 번째 위치에서 왼쪽으로 이동하면 마지막 문자에 커서)
▶ - 커서를 오른쪽으로 이동
예를 들어 아래의 방법으로 "JAZ"를 만들 수 있습니다.
-첫 번째 위치에서 조이스틱을 위로 9번 조작하여 J를 완성합니다.
-조이스틱을 왼쪽으로 1번 조작하여 커서를 마지막 문자 위치로 이동시킵니다.
-마지막 위치에서 조이스틱을 아래로 1번 조작하여 Z를 완성합니다.
따라서 11번 이동시켜 "JAZ"를 만들 수 있고, 이 때가 최소 이동입니다.
만들고자 하는 이름 name이 매개변수로 주어질 때, 이름에 대해 조이스틱 조작 횟수의 최솟값을 return 하도록 solution 함수를 만드세요.
풀이방법:
이 조이스틱은 크게 두가지를 최적의 방법으로 정해야 한다.
첫번째는 문자의 이동이다. 위 방향키를 사용해서 원하는 문자로 이동을 할지 아래 방향키를 사용할지를 정해야 한다. 이것은 비교적 간단하다. 알파벳은 총 26자이므로 A에서 14번째에 존재하는 알파벳은 위 방향키보다 아래 방향키로 이동하는 것이 더 효율적이기 때문이다. 이는 아스키코드 함수인 ord를 사용해서 이동하고 그 차이만큼 answer에 더하도록 한다.
두번째는 위치의 이동이다. 문자 중 A가 존재한다면 문자를 이동시킬 필요가 없으므로 왼쪽으로 이동할지 오른쪽으로 이동할지 결정을 해야한다.
이는 하나의 반복을 이용해서 결정하도록 하였다. 방금 문자를 이동시킨 인덱스에서 오른쪽 문자와 왼쪽 문자 중 A가 아닌 것을 더 빨리 만나는 쪽으로 이동하도록 하였다. 파이썬의 인덱스는 음수로 가면 오른쪽 맨 끝으로 이동하기 때문에 1씩 빼는 과정에서 음수로 가도 문제가 없다.
이 두가지의 방법을 원하는 알파벳을 만들때까지 반복하도록 한다.
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 | def solution(name): answer = 0 name=list(name) base=["A"]*len(name) idx=0 while(True): rightidx=1 leftidx=1 if name[idx]!="A": if ord(name[idx])-ord("A")>13: answer+=26-(ord(name[idx])-ord("A")) else: answer+=ord(name[idx])-ord("A") name[idx]="A" if name ==base: break else: for i in range(1,len(name)): if name[idx+i]=="A": rightidx+=1 else: break if name[idx-i]=="A": leftidx+=1 else: break if rightidx>leftidx: answer+=leftidx idx-=leftidx else: answer+=rightidx idx+=rightidx return answer | cs |
728x90
반응형
'Algorithm > Python' 카테고리의 다른 글
[Programmers]Lv 2.더 맵게 (0) | 2019.02.10 |
---|---|
[Programmers]Lv 1.같은 숫자는 싫어 (0) | 2019.02.09 |
[Programmers]Lv 1.문자열 내 마음대로 정렬하기 (0) | 2019.02.07 |
[Programmers]Lv 2.주식 가격 (0) | 2019.02.06 |
[Programmers]Lv 1.소수 찾기 (0) | 2019.02.05 |