본문 바로가기

알고리즘 공부

조이스틱 -프로그래머스 탐욕법 -

728x90
반응형

문제 설명

조이스틱으로 알파벳 이름을 완성하세요. 맨 처음엔 A로만 이루어져 있습니다.
ex) 완성해야 하는 이름이 세 글자면 AAA, 네 글자면 AAAA

조이스틱을 각 방향으로 움직이면 아래와 같습니다.

▲ - 다음 알파벳 ▼ - 이전 알파벳 (A에서 아래쪽으로 이동하면 Z로) ◀ - 커서를 왼쪽으로 이동 (첫 번째 위치에서 왼쪽으로 이동하면 마지막 문자에 커서) ▶ - 커서를 오른쪽으로 이동

예를 들어 아래의 방법으로 JAZ를 만들 수 있습니다.

- 첫 번째 위치에서 조이스틱을 위로 9번 조작하여 J를 완성합니다. - 조이스틱을 왼쪽으로 1번 조작하여 커서를 마지막 문자 위치로 이동시킵니다. - 마지막 위치에서 조이스틱을 아래로 1번 조작하여 Z를 완성합니다. 따라서 11번 이동시켜 "JAZ"를 만들 수 있고, 이때가 최소 이동입니다.

만들고자 하는 이름 name이 매개변수로 주어질 때, 이름에 대해 조이스틱 조작 횟수의 최솟값을 return 하도록 solution 함수를 만드세요.

제한 사항

  • name은 알파벳 대문자로만 이루어져 있습니다.
  • name의 길이는 1 이상 20 이하입니다.

입출력 예

namereturn

JEROEN 56
JAN 23

출처

※ 공지 - 2019년 2월 28일 테스트케이스가 추가되었습니다.

 

풀이


내 풀이

def solution(name):
    answer = 0
    name = list(name)
    alpa=['A', 'B', 'C', 'D', 'E', 'F', 'G', 'H', 'I', 'J', 'K', 'L', 'M', 'N', 'O', 'P', 'Q', 'R', 'S', 'T', 'U', 'V', 'W', 'X', 'Y', 'Z'] #a~z까지 몇번 바꾸는지 알기위해서 리스트 작성 
    #전부 A로 되어있기 때문에 A는 리스트로 봤을때 0이 되므로 A를 포함한 리스트 작성
    i = 0
    while True:
        right = 1
        left = 1
        if name[i] != 'A': #A가 아닌경우만 한 이유는 전부 A가 되면 break로 while문 탈출을 위해 작성
            if alpa.index(name[i]) >13:
                answer= answer+len(alpa)-alpa.index(name[i])
            else:
                answer +=alpa.index(name[i])
        name[i] = "A"#while 탈출을 위해 찾은 단어는 A로 변형
        if name == ["A"]*len(name): #전부 A가 되면 탈출
            break

        for j in range(1,len(name)):#오른쪽으로 갔을때 A가 연속으로 몇개 있는지 확인
            if name[i+j]=="A": 
                right+=1
            else: 
                break
        for j in range(1,len(name)):#왼쪽으로 갔을때 A가 연속으로 몇개 있는지 확인
            if name[i-j]=="A": 
                left+=1
            else: 
                break
        if right>left:#라이트가 더 많으면 왼쪽으로 이동 i가 음수면 자동으로 끝에서 부터 이동 하므로상관없습니다
            answer+=left
            i-=left
        else:
            answer+=right
            i+=right
    return answer

 

일단 알파벳 리스트를 작성해 주었다

맨처음은 A로 이루어져 있기 때문에 A가 리스트 제일 앞으로와서 0이 되게 했습니다

while을 돌렸고 찾은 단어를 A로 변경시켜 주며 전부 A가 되었을때 break해 주었습니다

제일 작은 경우는 오른쪽에 A가 적으면 오른쪽으로 이동 아니면 왼쪽으로 이동해주면 되기 때문에

for문을 돌려서 확인해주면서 진행하였습니다 

728x90
반응형