코딩테스트 연습 - 조이스틱 | 프로그래머스 (programmers.co.kr)

 

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

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

programmers.co.kr

 

풀이)

접근방식)

전체 이동횟수는 (알파벳 변경 + 해당 위치까지의 접근)이다. 따라서 두 가지 경우를 나눠서 이동횟수를 체크했다.

1. 알파벳 변경 최소 이동횟수

  알파벳에 인덱싱을 해보면 1 ~ 26이 되는데 이 때, 1 ~ 13( 1 ~ 13)  | 14 ~ 26( 13 ~ 1) 과 같은 방식으로 인덱싱한다.

2. 해당 위치까지의 접근

  이 경우에는 바꿔야 할 알파벳의 갯수에 따라 한번 더 경우를 나눴는데 다음과 같다.(각 상황별로 모든 경우 중 최소)

  (1) 바꿔야 할 알바벳의 갯수가 1일 때

  • 직행
  • 역행

  (2) 2일 경우  ex) AABAABAA 

  •  start -> front -> end // 직행
  •  start -> front -> start -> end // front찍고 end
  •  start -> end -> front // 역행
  •  start -> end -> start -> front // end찍고 front

  (3) 3이상일 경우 ex) ABABBAABA

  •   start -> front -> end // 직행
  •   start -> front -> start -> end -> front + 1 // front찍고 역행하여 front 다음 위치까지
  •   start ->end -> front // 역행
  •   start -> end -> start -> front -> end - 1 // end찍고 front 돌아와서 end 이전 위치까지
def solution(name):
    answer = 0
    position = []
    list = []
    l = []
    for i in range(len(name)):
        if (ord(name[i]) - 65) < 13: # A(0) ~ M(12)
            a = ord(name[i]) - 65 
        else:  # N(13) ~ Z(25)
            a = abs(ord(name[i]) - 90 - 1)  
        answer  += a
        
        if(name[i] != "A"): 
            position.append(i) #바꿔야 할 알파벳의 위치 인덱스

    if len(position) == 1: #바꿔야 할 알파벳이 1개
        answer = min(position[0],(len(name) - positon[0])) #min(정방향,역방향)
        
    elif len(position) ==2:
        front = position[0]
        end = position[1]
        
        list.append(end) # start -> front -> end // 직행
        list.append(front + front + (len(name) - end) ) # start -> front -> start -> end // front찍고 end
        list.append(len(name) - front + 1) #  start -> end -> front // 역행
        list.append((len(name) - end) + (len(name) - end) + front) #  start -> end -> start -> front // end찍고 front
        m = list[0]
        for v in list:
            if v < m:
                m = v
        answer += m
        
    elif len(position) > 2:
        front = position[0]
        
        end = position[-1]
        
        list.append(end) # start -> front -> end // 직행
        list.append(front + front + (len(name) - position[1]) ) # start -> front -> start -> end -> front + 1 // front찍고 역행하여 front 다음
        list.append(len(name) - front) # start ->end -> front // 역행
        list.append((len(name) - end) + (len(name) - end) + position[-2]) # start -> end -> start -> front -> end - 1 // end찍고 front 돌아와서 end 이전
        
        m = list[0]
        for v in list:
            if v < m:
                m = v
        answer += m
    

    return answer

'프로그래머스' 카테고리의 다른 글

괄호 회전하기  (0) 2021.10.18
튜플  (0) 2021.10.10
다음 큰 숫자  (0) 2021.10.03
거리두기 확인  (0) 2021.10.03
뉴스 클러스터링  (0) 2021.09.27

+ Recent posts