코딩테스트 연습 - 조이스틱 | 프로그래머스 (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