코테 노트/프로그래머스

Level 2 조이스틱 Python3

화요밍 2021. 7. 15. 21:33
728x90
반응형

https://programmers.co.kr/learn/courses/30/lessons/42860?language=python3 

 

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

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

programmers.co.kr

 

최종 코드

 

hwayeon351/Programmers-Algorithms

프로그래머스 알고리즘 소스 코드 모음. Contribute to hwayeon351/Programmers-Algorithms development by creating an account on GitHub.

github.com

def solution(name):
    alpha = {'A': 1, 'B': 2, 'C': 3, 'D': 4, 'E': 5, 'F': 6, 'G': 7, 'H': 8, 'I': 9, 'J': 10, 'K': 11, 'L': 12, 'M': 13, 'N': 14, 'O': 15, 'P': 16, 'Q': 17, 'R': 18, 'S': 19, 'T': 20, 'U': 21, 'V': 22, 'W': 23, 'X': 24, 'Y': 25, 'Z': 26}
    cnt = 0
    name = list(name)
    joy = ['A']*len(name)
    if 'A' != name[0]: 
        cnt = min(alpha[name[0]]-alpha['A'], alpha['Z']-alpha[name[0]]+alpha['A'])
        joy[0] = name[0]
    loc = 0
    while joy != name:
        for i in range(1, len(name)//2+1):
            left = (len(name)+loc-i)%len(name)
            right = (len(name)+loc+i)%len(name)
            if joy[right] != name[right]:
                loc = right
                cnt += i
                break
            elif joy[left] != name[left]:
                loc = left
                cnt += i
                break
        cnt += min(alpha[name[loc]]-alpha['A'], alpha['Z']-alpha[name[loc]]+alpha['A'])
        joy[loc] = name[loc]
                
    return cnt

풀이 과정

#조이스틱
def solution(name):
    alpha = {'A': 1, 'B': 2, 'C': 3, 'D': 4, 'E': 5, 'F': 6, 'G': 7, 'H': 8, 'I': 9, 'J': 10, 'K': 11, 'L': 12, 'M': 13, 'N': 14, 'O': 15, 'P': 16, 'Q': 17, 'R': 18, 'S': 19, 'T': 20, 'U': 21, 'V': 22, 'W': 23, 'X': 24, 'Y': 25, 'Z': 26}
    #조작 횟수, name 리스트화, joy 리스트 초기화
    cnt = 0
    name = list(name)
    joy = ['A']*len(name)
    #name 첫번째 문자가 A가 아닌 경우
    if 'A' != name[0]: 
        #다음 알파벳으로 바꾸는 경우와 이전 알파벳으로 바꾸는 경우의 최솟값을 cnt에 할당
        cnt = min(alpha[name[0]]-alpha['A'], alpha['Z']-alpha[name[0]]+alpha['A'])
        #joy 첫번째 문자를 name 첫번째 문자로 바꿔준다
        joy[0] = name[0]
    #커서 위치를 나타내는 loc
    loc = 0
    #joy와 name이 같아질 때 까지 반복
    while joy != name:
        #왼쪽 방향의 문자를 바꿀지 오른쪽 방향의 문자를 바꿀지 결정
        #커서를 i번 왼쪽과 오른쪽으로 움직였을때 바꿔야하는 문자가 있는 경우 탐색
        for i in range(1, len(name)//2+1):
            left = (len(name)+loc-i)%len(name)
            right = (len(name)+loc+i)%len(name)
            #오른쪽으로 움직여 문자를 바꿔야 하는 경우 커서를 i번 이동한다
            if joy[right] != name[right]:
                loc = right
                cnt += i
                break
            #왼쪽으로 움직여 문자를 바꿔야 하는 경우 커서를 i번 이동한다
            elif joy[left] != name[left]:
                loc = left
                cnt += i
                break
        #loc에 있는 문자를 바꿔준다
        cnt += min(alpha[name[loc]]-alpha['A'], alpha['Z']-alpha[name[loc]]+alpha['A'])
        joy[loc] = name[loc]
                
    return cnt
#시간복잡도 = O(n^2), 공간복잡도 = O(n)

def solution(name):
    alpha = {'A': 1, 'B': 2, 'C': 3, 'D': 4, 'E': 5, 'F': 6, 'G': 7, 'H': 8, 'I': 9, 'J': 10, 'K': 11, 'L': 12, 'M': 13, 'N': 14, 'O': 15, 'P': 16, 'Q': 17, 'R': 18, 'S': 19, 'T': 20, 'U': 21, 'V': 22, 'W': 23, 'X': 24, 'Y': 25, 'Z': 26}
    if name.count('A') == len(name): return 0
    cnt = 0
    for s in name:
        if s == 'A': continue
        cnt += min(alpha[s]-alpha['A'], alpha['Z']-alpha[s]+alpha['A'])
    name = list(name)
    name[0] = 'A'
    i = 0
    while True:
        if name.count('A') == len(name): return cnt
        for j in range(1, len(name)//2+1):
            left = (len(name)+i-j)%len(name)
            right = (len(name)+i+j)%len(name)
            if name[left] == name[right] == 'A': continue
            if name[right] != 'A':
                i = right
                name[right] = 'A'    
            elif name[left] != 'A':
                i = left
                name[left] = 'A'
            cnt += j
            break
    return cnt
728x90
반응형

'코테 노트 > 프로그래머스' 카테고리의 다른 글

Level 3 단속카메라 Python3  (0) 2021.07.16
Level 2 큰 수 만들기 Python3  (0) 2021.07.15
Level 3 섬 연결하기 Python3  (0) 2021.07.15
Level 2 구명보트 Python3  (0) 2021.07.15
Level 3 등굣길 Python3  (0) 2021.07.13