ABOUT ME

-

Today
-
Yesterday
-
Total
-
  • 키패드 누르기
    코딩테스트 2022. 1. 25. 13:38

    https://programmers.co.kr/learn/courses/30/lessons/67256/solution_groups?language=python3&type=my 

     

    프로그래머스

    코드 중심의 개발자 채용. 스택 기반의 포지션 매칭. 프로그래머스의 개발자 맞춤형 프로필을 등록하고, 나와 기술 궁합이 잘 맞는 기업들을 매칭 받으세요.

    programmers.co.kr

     

    distance 구하기 기본문제

     

    배열로 해도 되는데, 그냥 integer로 생각했을 때, 값이 3 차이나면 위/아래 3보다 크면 대각선, 3보다 작으면 양옆 차이라는 특징을 들고 배열없이 바로 해봤다.

     

    문제 구조가 좀 더 복잡해진다면 2차원 배열로 구성해서 위치를 찾아가는게 더 편할 것 같다.

     

    def get_distance(cur, target):
        distance = 0
        while abs(cur-target) >= 3:
            distance += 1
            if cur > target:
                cur -= 3
            else:
                cur += 3
    
        distance += abs(cur-target)
        return distance
    
    
    def solution(numbers, hand):
        answer = ''
    
        left = 10
        right = 12
    
        for number in numbers:
            if number == 0:
                number = 11
            if number in [1, 4, 7]:
                left = number
                answer += 'L'
            elif number in [3, 6, 9]:
                right = number
                answer += 'R'
            else:
                left_distance = get_distance(left, number)
                right_distance = get_distance(right, number)
    
                if left_distance > right_distance:
                    right = number
                    answer += 'R'
                elif right_distance > left_distance:
                    left = number
                    answer += 'L'
                else:   # same distance
                    if hand == 'right':
                        right = number
                        answer += 'R'
                    else:
                        left = number
                        answer += 'L'
    
        return answer

     

    우선 위에서 말한 방법대로 배열 없이 문제를 풀기 위해서는 0이 0이면 안된다(?).

    0의 위치는 숫자로 바꿨을 때에는 11.

    1   2   3

    4   5   6

    7   8   9

    10 11 12

     

    일단 1,4,7 또는 3,6,9인 경우 distance를 구할 필요 없이 손을 이동시키면 된다.

    나머지 경우에는 left와 right hand와 target number 사이의 거리를 구한다.

     

    이 때, cur와 target의 거리가 3 이상인 경우 같은 라인에 있지 않으므로, 동일 선상에 위치할 때 까지 손을 위 또는 아래로 이동시킨다.

     

    사실 이 키패드는 열의 길이가 3밖에 되지 않고, 오른손과 왼손의 영역이 구분되어 있어 여러 칸 움직일 일이 없어 무조건 1만 더하면 되지만, 키패드가 확장되는 경우에도 적용할 수 있도록 두 점 사이의 거리를 더해준다.

    이후 같은 선상에 위치하게 되면 cur와 target 사이의 거리가 이동해야 하는 거리이다.

     

    이후 두 손의 target number에 대한 거리에 따라 어느 손을 움직일지 결정한다.

    '코딩테스트' 카테고리의 다른 글

    크레인 인형뽑기 게임  (0) 2022.01.26
    [1차] 추석 트래픽  (0) 2022.01.25
    숫자 문자열과 영단어  (0) 2022.01.24
    오픈채팅방  (0) 2022.01.24
    문자열 압축  (0) 2022.01.24
Designed by Tistory.