[python] 조이스틱

JunHyeok Oh·2021년 7월 3일
0

문제

문제 설명

  • 조이스틱으로 알파벳 이름을 완성하세요. 맨 처음엔 A로만 이루어져 있습니다.
    ex) 완성해야 하는 이름이 세 글자면 AAA, 네 글자면 AAAA

  • 조이스틱을 각 방향으로 움직이면 아래와 같습니다.

조이스틱 방향눌렀을 때 효과
다음 알파벳
이전 알파벳 (A에서 아래쪽으로 이동하면 Z로)
커서를 왼쪽으로 이동 (첫 번째 위치에서 왼쪽으로 이동하면 마지막 문자에 커서)
커서를 오른쪽으로 이동
  • 예를 들어 아래의 방법으로 "JAZ"를 만들 수 있습니다.
    -> 첫 번째 위치에서 조이스틱을 위로 9번 조작하여 J를 완성합니다.
    -> 조이스틱을 왼쪽으로 1번 조작하여 커서를 마지막 문자 위치로 이동시킵니다.
    -> 마지막 위치에서 조이스틱을 아래로 1번 조작하여 Z를 완성합니다.
    따라서 11번 이동시켜 "JAZ"를 만들 수 있고, 이때가 최소 이동입니다.

만들고자 하는 이름 name이 매개변수로 주어질 때, 이름에 대해 조이스틱 조작 횟수의 최솟값을 return 하도록 solution 함수를 만드세요.

제한 사항

  • name은 알파벳 대문자로만 이루어져 있습니다.
  • name의 길이는 1 이상 20 이하입니다.

풀이

나의 풀이

def solution(name):
    name = list(name)
    count = 0
    answer = -1
    # aa는 커서를 거꾸로 올리는 것을 1번만 하기위한 장치
    aa = 0
    for i in range(len(name)):
    	# N을 기준으로 구분
        # 알파벳 변경할 때 클릭수
        if ord(name[i]) <= 78 :
            count = ord(name[i]) - 65
        else:
            count = 91 - ord(name[i])
        
        # 커서를 효율적인 방향으로 구하기
        # 순차적으로 진행할 시 len(name) - 1 만큼의 횟수가 더해짐
        # 하지만 특정지점에서 인덱스의 길이 만큼의 "A"가 이어진다면 
        # 거꾸로 올라가는 것이 효율적 
        if (i <= len(name)/2) & (aa == 0) :
            # set에 담기면 중복이 사라짐.
            if list(set(name[i:i+i])) == ["A"] :
                    counta = 0
                    indexa = 2 * i
                    # 연이어서 나오는 A의 수 구하기
                    while name[indexa] == "A":
                        counta +=1
                        indexa +=1
                    count -= counta + 1
                    aa +=1
            # 인덱스가 1일 경우는 따로 구해줌. 
            # 슬라이싱에 의해 1일 경우는 잘리기 때문이다.
            elif name[1] == ["A"]:
                    counta = 0
                    indexa = 2 * i
                    while name[indexa] == "A":
                        counta +=1
                        indexa +=1
                    count -= counta + 1 
                    aa +=1
        answer += count + 1 
    
    return answer
  • 첫번째로 조이스틱으로 알파벳을 변경할때의 클릭 횟수를 먼저 구했다. N을 기준(아스키코드 ord("N") = 78)으로 N보다 뒤에 나오는 알파벳들은 거꾸로 올라가는 것이 더 효율적이고 N보다 앞에 나오는 알파벳들은 순차적으로 조이스틱을 클릭하는 것이 효율적이다.
  • 그러므로 if 문에 아스키코드로 변환하는 함수 ord를 사용하여 N을 기준으로 앞에있으면 65를 빼주었고, 뒤에 있으면 91에서 빼주었다. ( 이렇게 빼주면 조이스틱 클릭 수 와 같아짐.)
  • 그 다음에는 커서를 이동하는 규칙을 설정하는 것이 중요했다.
  • 순차적으로 커서를 오른쪽으로 이동할 시 len(name) - 1 만큼의 횟수가 더해진다. 하지만 특정지점에서 그 지점의 인덱스의 길이 만큼의 "A"가 이어서 나온다면 거꾸로 커서를 보내는 것이 더 효율적이라는 사실을 알아내었다.
  • 그래서 name[i:i+i] 즉, i번째 인덱스에서 그 이후 i번 동안 연속해서 "A" 가 나올 경우 커서를 거꾸로 보내는 count를 계산했다.
  • "A"가 인덱스의 길이만큼 나올경우 커서 이동 클릭 수는 순차적으로 진행할 때보다 1 감소함을 이용해, 연이어서 나오는 "A"의 수를 적절히 빼주었다.
  • 또한 지금 코드에서 연이어서 "A"가 나오는 조건이 한 번의 for문 안에서 2번 성립할 수도 있기 때문에 aa 조건 추가를 통해 한번만 커서를 거꾸로 올리도록 설정했다.

테스트 케이스

namereturn
"JEROEN"56
"JAN"23

출처 : 프로그래머스 - 조이스틱 문제

profile
Univ of Seoul , Statistics

0개의 댓글

관련 채용 정보