algorithm/프로그래머스 문제

[LV2]조이스틱

장경훈 2022. 7. 12. 11:46
[LV2]조이스틱 문제링크
조이스틱으로 알파벳 이름을 완성하세요. 맨 처음엔 A로만 이루어져 있습니다.
ex) 완성해야 하는 이름이 세 글자면 AAA, 네 글자면 AAAA
조이스틱을 각 방향으로 움직이면 아래와 

www.programmer.co.kr

 

문제 해설 

 

  • 우선 전체 알파벳의 중간지점을 기준으로 현재 문자부터 'A' 까지 걸리는 거리의 최소값을 answer에 더함으로써 상하의 이동값을 계산한다.
  • 좌우에서 최소한의 이동을 가지려면 'A'가 연속적으로 있는곳으로는 갈 필요가 없고 만약 연속된 'A'가 여러곳에 있다면 연속된 길이가 긴 곳보다 짧은곳을 가는것이 이득이다.
  • 연속된 A의 왼쪽으로 가는 방법과 오른쪽으로 가는 방법과 기본 움직임 중에서 최소값을 구한다.
def solution(name):
    answer=0
    move=len(name)-1 #최대한으로 움직이는 거리는 전체 길이-1
    
    for i, alpha in enumerate(name):
        answer+=min(ord(alpha)-ord('A'),ord('Z')-ord(alpha)+1) #상하 이동 횟수 계산 

        repeatA=i+1 #연속된 A의 마지막 인덱스
        while repeatA<len(name) and name[repeatA]=='A': #연속된 'A'의 개수 찾기
            repeatA+=1
            
        move=min(move,2*i+len(name)-repeatA,i+2*(len(name)-repeatA))# 현재 위치에서 오른쪽과 왼쪽을 탐색하여 더 적은 횟수가 드는곳을 정한다
        answer+=move
    return answer

 

피드백

 

  • 이 문제는 상하의 개수를 구하는 생각까지는 했지만 좌우 움직임을 계산하는데 어려움이 있었고 처음에는 인덱스 절반을 나누어 'A'가 더 적은 곳으로 돌면 될거같다는 생각을 가지고 시작했었다. 하지만 이 생각이 잘못되었고 어떤 방식으로 찾아야 할지 몰라서 구글검색을 통해 해결방안을 얻었다
  • 이 문제에서 핵심은 연속되는 'A' 즉 필요없는 움직임이 있는곳을 기준으로 풀었을때 가장 효율적임을 알 수있었다. 차후에 비슷한 유형의 문제가 있으면 이런점을 먼저 고려해봐야겠다
  • 구글을 통해서 해결했기 때문에 시간이 지난 후 다시 복습을 해서 개념을 완전히 내 걸로 만들어야 겠다

'algorithm > 프로그래머스 문제' 카테고리의 다른 글

[프로그래머스 LV2] 튜플  (0) 2022.07.14
[LV2]위장  (0) 2022.07.13
[LV2]전화번호 목록  (0) 2022.07.13
[LV2]타겟 넘버  (0) 2022.07.11
[LV2]짝지어 제거하기  (0) 2022.07.11