https://programmers.co.kr/learn/courses/30/lessons/42860

 

코딩테스트 연습 - 조이스틱

조이스틱으로 알파벳 이름을 완성하세요. 맨 처음엔 A로만 이루어져 있습니다. ex) 완성해야 하는 이름이 세 글자면 AAA, 네 글자면 AAAA 조이스틱을 각 방향으로 움직이면 아래와 같습니다. ▲ - 다

programmers.co.kr


내 풀이

 

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

+ Recent posts