문제
https://school.programmers.co.kr/learn/courses/30/lessons/42860
참고 풀이 공부해서 재시도 성공
ex) JJJAAAAAAAAKKK 전체길이 14 i=2 - next_i=11
- 방법1) 오른쪽으로 쭉 이동 : len(name)-1
- 방법2) 왼쪽부터 시작 : 맨앞에서부터 i만큼 우측이동, 좌측으로 돌아가기(i*2), 맨뒤에서부터 다음 인덱스 next_i까지 이동(len(name)-next_i)
- 방법3) 오른쪽부터 시작 : 맨뒤에서부터 next_i인덱스까지 좌측이동, 우측으로 돌아가기 2*(len(name)-nex_i)
방법2의 경우 A연속 문자열 양옆중 좌측이 더 적을경우 유리 방법3의 경우 A연속 문자열 양옆중 우측이 더 적을경우 유리
만약 연속 A문자열이 여러 곳에 있어도, 가장 최소 움직임 횟수를 계속 move에 넣기때문에 교체됨
'''
JJJ.AAAAAAAA.KKk
전체길이 14
i=2 - next_i=11
방법1) 오른쪽으로 쭉 이동 : len(name)-1
방법2) 왼쪽부터 시작 : 맨앞에서부터 i만큼 우측이동, 좌측으로 돌아가기(i*2), 맨뒤에서부터 다음 인덱스 next_i까지
이동(len(name)-next_i)
방법3) 오른쪽부터 시작 : 맨뒤에서부터 next_i인덱스까지 좌측이동, 우측으로 돌아가기 2*(len(name)-nex_i)
방법2의 경우 A연속 문자열 양옆중 좌측이 더 적을경우 유리
방법3의 경우 A연속 문자열 양옆중 우측이 더 적을경우 유리
만약 연속 A문자열이 여러 곳에 있어도, 가장 최소 움직임 횟수를 계속 move에 넣기때문에 교체됨
'''
def solution(name):
#상하 - 최소 알파벳 이동 횟수 찾기
answer = 0
for a in name:
# min(상이 유리한 경우, 하가 유리한 경우)
answer += min(abs(ord("A") - ord(a)), 26 - abs(ord("A") - ord(a)))
#좌우 - 최소 이동 횟수 찾기
move = len(name) - 1
for i, a in enumerate(name):
# 다음 인덱스부터 연속 A찾으며 그 다음 인덱스 저장
next_i = i + 1
while next_i < len(name) and name[next_i] == 'A':
next_i += 1
move = min(move, i*2 + len(name)-next_i, 2*(len(name)-next_i) + i)
return answer + move
'개발 > Algorithm' 카테고리의 다른 글
| [프로그래머스/42862/level1/고득점kit] 체육복 - 그리디 (0) | 2023.08.14 |
|---|---|
| [프로그래머스/42885/level2/고득점kit] 구명보트 - 그리디, 두 포인터 사용 (0) | 2023.08.14 |
| [프로그래머스/84512/level2/고득점kit] 모음사전 - 완전탐색, 중복순열 product (0) | 2023.08.10 |
| [프로그래머스/86971/level2/고득점kit] 전력망을 둘로 나누기 - 완전탐색, BFS (0) | 2023.08.10 |
| [백준/기본기 다지기(2)] 최대공약수(유클리드 호제)&최소공배수, 브루트포스, 피보나치 수(재귀) (0) | 2023.08.08 |