[Python3] 프로그래머스 조이스틱(abs(),ord())

민갱·2023년 6월 29일

CT

목록 보기
20/35

위아래, 양옆으로 조이스틱 방향키에 따라 누르는 계산을 따로 해서 더해야 한다는 컨셉만 잡았고, 실패,,,ㅎㅎㅎ
알파벳 위치 구하는(위아래)것은 어렵지 않았는데,,도대체 양옆으로 이동하는것은🙃
나는 연속되는 A를 기준으로 왼쪽에서 시작했을때, 오른쪽에서 시작했을때의 이동 카운트를 세는것이 다른 사람들의 풀이를 보고도(한글을..보고도) 이해가 잘 되지 않았다ㅎ

조이스틱

실패.

def solution(name):
    answer = 0
    alpha = 'ABCDEFGHIJKLMNOPQRSTUVWXYZ'
    alphare = 'ZYXWVUTSRQPONMLKJIHGFEDCBA'
    
    tmp = []
    cnt  = 0
    for i in name:        
        if int(alpha.find(i)) < int(alphare.find(i)):
            cnt = int(alpha.find(i))+1
        else :
            cnt = int(alphare.find(i))+2
        if abs(int(alpha.find(i)) - int(alphare.find(i))) == 1:           
        
        tmp.append(cnt)
    print(sum(tmp)-1)
            
    return answer

성공.

#def solution(name):
#	answer = 0
#    num_list = [min(abs(ord('A')-ord(n),abs(26-ord(n))) for n in name]
#    min_move = len(name)-1
#    
#    for i,c in enumerate(name):
#    	next = i + 1
#        while next < len(name) and name[next] == 'A':
#        	next +=1
#        min_move = min(min_move, i*2 + len(name) - next ,(len(name)-next)*2+i) #   
#    return answer+min_move
def solution(name):
    answer = 0
    
    num_list = [min(abs(ord('A')-ord(n)),26-abs(ord('A')-ord(n))) for n in name]
    
    answer += sum(num_list)
    min_move = len(name) -1
    tmp = []    
    for i,c in enumerate(name):
        next_i = i+1
        
        while next_i < len(name) and name[next_i] == 'A':
            next_i +=1
        # tmp.append(min_move)
        # tmp.append(2*i + len(name) - next_i)
        # tmp.append(2*(len(name)-next_i)+i)
        # tmp.append('----')
        min_move = min(min_move, 2*i + len(name) - next_i,2*(len(name)-next_i)+i)          
    print(tmp)    
    print(min_move)
    print(answer)
    return answer+min_move
    
    
  • 나는 프린트로 다 찍어 봤다. min_move 부분이 이해가 되지 않아서, 결국에는 for 문의 글자가 하나씩 이동 할때 마다 min_move, 2i + len(name) - next_i,2(len(name)-next_i)+i를 계산해줘서 제일 작은것을 min_move에 담아서 마지막에 더해주는데,
  • name의 길이에서 한개 뺀것 = 순서대로 지나간것
  • 2*i + len(name) - next_i = i까지가 A를 만나기 전 까지, 갔다가 돌아와서 2를 해준것이고,len(name)에서 A까지 이동한 거리를 빼니깐 나머지 수를더 해준거고 왼쪽에서 시작한 것을 알 수 있다.
  • 2*(len(name)-next_i)+i = 오른쪽에서 부터 시작해서 A를 만나기 전까지 전체 길이에서 A까지의 길이를 뺀 것 만큼 이동한것을 다시 돌아오고 i는 나머지 A서부터 왼쪽 끝까지의 수를 더해준 것이다.

참고.(이동 순서를 잘 표현해 주셨다 :))

https://bellog.tistory.com/152

profile
가보자고

0개의 댓글