본문 바로가기
코테 준비

[프로그래머스] 조이스틱(python)

by 박수련 2024. 3. 22.

문제 

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

 

1. 주어진 이름과 같은 길이를 가지며 A로만 구성된 문자열을, 주어진 이름으로 바꿔야 한다. 

2. 다음과 같이 조이스틱을 각 방향으로 움직일 수 있다.

 

3. 이때 조이스틱 조작 횟수의 최솟값을 구하는 문제이다. 

 

틀린 풀이

상하 조이스틱은 ord를 사용해 조이스틱 간의 거리를 구할 수 있다. 

좌우 조이스틱은 연속된 A의 최대 길이를 구하고 len(name)-1에서 빼주면 된다고 생각했다. 

→ 커서가 문자열의 맨앞에서 시작된다는 점을 간과해서 틀렸다. 

def solution(name):
    answer = 0

    leng = len(name)
    init = "A" * leng

    arr = []
    for idx, n in enumerate(name):
        # 주어진 알파벳으로 바꾸기 위한 최소 이동 거리 찾기
        if n != "A":
            dif = abs(ord("A") - ord(n))
            answer += min(dif, 26 - dif)
        else:
            arr.append(idx)

    # name에 A가 없다면 leng-1 만큼 좌우 이동
    if len(arr) == 0:
        answer += leng - 1
        return answer

    # 연속된 A값들의 최대 길이 찾기
    cnt = 1
    maxl = 1
    for i in range(1, len(arr)):
        if arr[i - 1] == arr[i]:
            cnt += 1
        else:
            maxl = max(maxl, cnt)
            cnt = 1

    answer += leng - 1 - maxl

    return answer

 

 

제출한 코드 

다른 블로그를 참고했다. 

 

1. while문을 통해 현재 위치 idx보다 오른쪽에 위치하고 "A"가 아닌 문자의 인덱스 중 최소값(post)를 구한다. 

2. 사이에 낀 A의 값을 피하기 위한 방법 중 가장 최소값을 구해준다. 

 

move

문자열에서 제일 앞 문자와 끝 문자까지 커서를 이동시키기 위한 최소 거리

 

2 * idx + len(name) - post

시작점 → idx

idx → 시작점

시작점 → 왼쪽으로 이동해 post 까지의 거리합

 

2 * (len(name) - post) + idx

시작점 → 왼쪽으로 이동해 post

post → 끝점

끝점 → 오른쪽으로 이동해 idx

 

→ 반복문에서 위 값들 중 최솟값을 찾아서 move에 저장

 

def solution(name):
    answer = 0

    move = len(name) - 1

    for idx, n in enumerate(name):
        answer += min(ord(n) - ord("A"), ord("Z") - ord(n) + 1)

        post = idx + 1
        while post < len(name) and name[post] == "A":
            post += 1

        move = min([move, 2 * idx + len(name) - post, idx + 2 * (len(name) - post)])

    answer += move

    return answer

 

참고

https://aiday.tistory.com/120

 

회고

좌우 이동할 때 커서가 문자열 맨앞에서 시작된다는 걸 고려하지 않고 맘대로 풀었다. 

그리고 참고한 코드를 이해하는데까지 엄청 오래걸렸다. 

점점 코테 실력이 퇴화되는 것 같다...... 그래도 즐기면서 했으면 좋겠다. 

이걸 풀어 제껴 버려야겠다고 생각하니 오히려 더 깊게 생각을 못하는 것 같다. 

스스로 일정 시간 안에 풀이가 떠오르지 않거나 틀린 게 보이지 않으면 다른 풀이를 참고했었는데 이제는 다시 고민하는데에 집중할 필요가 있는 것 같다. 다음부터는 진득하게 시간의 여유를 가지고, 또 마음의 여유가 있을 때 풀어야겠다.