본문 바로가기

프로그래머스 풀이

프로그래머스 2단계 - 조이스틱 (Python)

깃허브:

https://github.com/MSIQOC/Programmers/blob/main/%EC%A1%B0%EC%9D%B4%EC%8A%A4%ED%8B%B1.py

 

https://programmers.co.kr/learn/courses/30/lessons/42860

 

코딩테스트 연습 - 조이스틱

조이스틱으로 알파벳 이름을 완성하세요. 맨 처음엔 A로만 이루어져 있습니다. ex) 완성해야 하는 이름이 세 글자면 AAA, 네 글자면 AAAA 조이스틱을 각 방향으로 움직이면 아래와 같습니다. ▲ - 다

programmers.co.kr

 

참고 블로그:

https://jgrammer.tistory.com/entry/%ED%94%84%EB%A1%9C%EA%B7%B8%EB%9E%98%EB%A8%B8%EC%8A%A4-%EC%A1%B0%EC%9D%B4%EC%8A%A4%ED%8B%B1

 

[프로그래머스] 조이스틱

문제 설명 조이스틱으로 알파벳 이름을 완성하세요. 맨 처음엔 A로만 이루어져 있습니다. ex) 완성해야 하는 이름이 세 글자면 AAA, 네 글자면 AAAA 조이스틱을 각 방향으로 움직이면 아래와 같습니

jgrammer.tistory.com

 

처음에 풀이 방법이 이해가 안돼서 참고 블로그를 통해서 알고리즘을 파악하고 다시 풀어보았다.

조이스틱의 기본 알고리즘은 코드를 분석해봤을 때 이렇게된다.

 

1. name 안의 각 알파벳에 대한 위아래로의 최소 이동값들을 구한다. (여기에서 초기상태는 다 A로 맞춰진 상태고 Z로 맞춰지면 한번은 위로 올려야하기 때문에 ord("Z") - ord(i)가 아니라 여기에 +1까지 해줘야한다.)

 

2. 오른쪽 왼쪽의 최소 이동값을 구해주고 이동길이가 더 짧은 쪽으로 이동시켜준다.

 

3. 모든 값들이 다 0으로 맞춰질 때까지 위의 과정을 반복한다.

 


Python

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
def solution(name):
    answer = 0
    make_name = [min(ord(i)-ord("A"), ord("Z")-ord(i)+1for i in name] #이름에서 실제로 더 가까운 거리를 계산
    #여기에서 Z로 맞춰지면 한번은 밑으로 내려야하기 때문에 +1을 해준다. (초기 세팅이 AAA로 돼있음.)
    p = 0
    while True:
        answer += make_name[p]
        make_name[p] = 0
        if sum(make_name) == 0:  #sum 메소드를 사용해서 배열의 총 합을 구한다.
            break
        l, r = 00
        pp = p
        while make_name[pp] == 0:
            l += 1
            pp -= 1
        pp = p
        while make_name[pp] == 0:
            r += 1
            pp += 1
        if l < r:
            p -= l
            answer += l
        else:
            p += r
            answer += r
    
    return answer
cs