[programmers] 조이스틱_greedy
Date:
[코딩테스트 연습] 조이스틱
풀이
- 방식 : Greedy
- 두 가지로 구분하여 문제를 접근, Cursor의 이동과 알파벳 변경
- 변수 s에 알파벳 변경에 필요한 조이스틱 조작 횟수
- 변수 c는 Cursor 이동 횟수
- 문자열을 뒤로 하나 씩 보내고 Left Strip을 통해 ‘A’를 지운 문자열의 길이에 이동하는데 필요한 a만큼 더 해줌
📰code
def solution(name):
s = sum(list(map(lambda x : min(ord(x)-ord('A'),ord('Z')+1-ord(x)), name)))
c = len(name)
a = 0
for i in range(len(name)//2+1):
if i>=1:
a = len(name[:i])-1
c = min(c,len((name[i:] + name[:i]).lstrip('A'))+a)
return s+c-1
다른 풀이
- 위와 같은 방식으로도 통과가 가능하지만, 예외 문자열이 있음
- name을 “BBABAAAB”로 입력 시 [왼 오 오 오 오]에 대한 경우 확인이 어려움
- 이 부분을 보완하기 위해 왼쪽으로 시작하는 것 뿐만 아니라, 오른쪽으로 시작하는 것을 추가함
📰code
def solution(name):
s = sum(list(map(lambda x : min(ord(x)-ord('A'),ord('Z')+1-ord(x)), name)))
c_r, c_l = len(name), len(name)
a_r, a_l = 0, 0
for i in range(len(name)//2+1):
if i>=1:
a_r = len(name[:i])-1
a_l = len(name[-i:])
c_r = min(c_r,len((name[i:] + name[:i]).lstrip('A'))+a_r)
c_l = min(c_l,len((name[-i:] + name[:-i]).rstrip('A'))+a_l)
c = min(c_r,c_l)
return s+c-1
💡 수정 필요한 내용은 댓글이나 메일로 알려주시면 감사하겠습니다!💡
댓글