https://programmers.co.kr/learn/courses/30/lessons/42860
내 풀이
def solution(name):
original_l = 'a' * len(name)
original_U = 'A' * len(name)
answer= 0
count = len(name) - 1
for i in range(len(name)):
answer +=min( abs( ord(name[i]) - ord(original_U[i]) ), abs( ord( original_l[i])-6-ord(name[i])))
next_idx = i + 1
while next_idx < len(name) and name[next_idx] == 'A':
next_idx += 1
count = min([count,2 *i + len(name) - next_idx, i + 2 * (len(name) -next_idx)])
answer += count
return answer
첫째로 구해야 할것은
알파벳을 몇개나 바꿔야 하는가.
이는 아스키코드로 알 수 있는데
A=65이다. 근데 우리가 하나 유념해야할것은, 비록 대문자만 받아들인다고 하더라도 거꾸로 갈 경우도 있다는것이다.
예를들어 A=65, Z=90 이므로 90 - 65 = 25로 총 25번을 움직여야하는데 실제로는 한번만 움직이면 된다.
그래서 내가 생각한 방법이 소문자 a에서 빼는것인데 소문자 a=97 이다.
근데 97 - 90 = 7이다. 그 이유는 대문자와 소문자 사이에 특수문자 6개가 있어서이다.
그래서 소문자 - 대문자 - 6을 해줘야한다.
(대문자 - 대문자),(소문자 - 대문자 - 6 ) 중에 더 작은 수를 택하면 된다.
두번째로 생각해볼 내용은
좌로 가는게 유리한지 우로 가는게 유리한지를 생각해봐야 한다.
가장 단순한 방법은 바꿔줘야 할 문자가 존재하든 존재하지 않든, 우로 쭉 가는것이다.
이 경우 문자열의 길이 - 1 만큼 바꿔주면 된다.
두번째로는 'A'를 만나기전까지 우측으로 가다가 'A'를 만나면 좌측으로 가고, 최초에 만난 'A'를 만나기전까지 좌측으로 가는 방법이다.
세번째는 두번째 방법과 동일한데 좌측을 먼저 탐색하는것이다.
다른사람의 풀이
'취준 > 프로그래머스' 카테고리의 다른 글
괄호 회전하기 - 파이썬 (0) | 2022.07.25 |
---|---|
게임 맵 최단거리 - 파이썬 (0) | 2022.07.05 |
소수 찾기 - 파이썬 (0) | 2022.07.02 |
가장 큰 수 - 파이썬 (0) | 2022.07.01 |
프린터 - 파이썬 (0) | 2022.06.27 |