문제: https://school.programmers.co.kr/learn/courses/30/lessons/42860
풀이(간단하게)
- 조이스틱의 조작 횟수 계산
- 상하로 움직이는 조작 횟수 계산
- 각 문자에 대해서 위, 아래로 움직이는 조작 횟수를 구하고 이 중 최솟값을 선택한다
- 좌우로 움직이는 조작 횟수 계산
- 기본값은 좌우 길이로 설정
- A가 연속적으로 연결된 부분을 찾고 시작과 끝 index 구하기
- A가 연속적인 배열을 기준으로 좌로 움직이든 우로 움직이든 결국 좌/우측 부분 중 한 곳은 2번을 지나야 하므로 좌/우 중 최솟값 구하기
- 기본값과 좌측 부분+우측 부분+최솟값(좌측 부분과 우측 부분 중) 중에 더 작은 것을 구해서 조작 횟수 계산
- 상하로 움직이는 조작 횟수 + 좌우로 움직이는 조작 횟수를 더해서 총 조작 횟수를 계산
- 상하로 움직이는 조작 횟수 계산
풀이(자세하게)
상하로 움직이는 조작 횟수 구하기
for i in name:
answer += min(ord(i)-ord('A'), ord('Z')-ord(i)+1)
- 목표하는 문자까지 위로 움직이는 횟수 구하기
- 둘 다 아스키코드로 변환하고, A부터 움직인 값 구하기
- 목표하는 문자까지 아래로 움직이는 횟수 구하기
- 둘 다 아스키코드로 변환하고 Z부터 움직인 값 구하기
- A에서 Z로 움직일 때 1번 조작하므로 1 더하기
좌우로 움직이는 조작 횟수 구하기
temp=0
shift=len(name)-1
for i in range(len(name)):
if name[i]=="A":
temp=i
while(temp<len(name) and name[temp]=="A"):
temp+=1
left=(0 if i==0 else i-1)
right=len(name)-temp
shift=min(shift,left+right+min(left,right))
- 기본 값은 전체 문자열의 길이로 설정(배열의 인덱스 값이므로 -1)
- A로 연속된 문자열 찾고 시작과 끝 인덱스 찾기
- 끝 인덱스를 설정할 temp 선언
- 문자열이 A일 때, 다음 문자도 A이라면 문자열의 끝까지 temp를 증가
- 구한 temp를 가지고 A의 연속된 문자열의 왼쪽 부분 left와 right 구하기
결과 값 반환
- 위에서 구한 상하로 움직이는 조작 횟수와 좌우로 움직이는 조작 횟수 더해서 총 조작 횟수 더하기
전체 코드
def solution(name):
answer = 0
for i in name:
answer += min(ord(i)-ord('A'), ord('Z')-ord(i)+1)
temp=0
shift=len(name)-1
for i in range(len(name)):
if name[i]=="A":
temp=i
while(temp<len(name) and name[temp]=="A"):
temp+=1
left=(0 if i==0 else i-1)
right=len(name)-temp
shift=min(shift,left+right+min(left,right))
answer+=shift
return answer