카카오 키패드 누르기

문제:
(https://programmers.co.kr/learn/courses/30/lessons/67256)

처음엔 이차원 배열을 쓰기 싫다는 마음이 강했다.
그래서 #과 *을 숫자로 대체하고 누르려고 하는 숫자와의 차의 절대값이 작은 손으로 누르는 것으로 코드를 작성하였으나 금방 문제가 발견되었다.

def solution(numbers, hand):
    answer = ''
    l = 10 #왼손 오른손의 위치 저장
    r = 12
    
    left = [1,4,7]
    right = [3,6,9]
    
    #목표치와의 차의 절대값 작은 손이 누름
    if hand == "right":
        for num in numbers:
            if num in left:
                l = num
                answer += "L"
            elif num in right:
                    r = num
                    answer += "R"
            else:
                if(abs(num-r) <= abs(num-l)): 
                    r =num
                    answer += "R"
                else:
                    l =num
                    answer+="L"
            
    else:
         for num in numbers:
            if num in left:
                l = num
                answer += "L"
            elif num in right:
                    r = num
                    answer += "R"      
            else:
                if(abs(num-r) <abs(num-l)): 
                    r =num
                    answer += "R"
                else:
                    l =num
                    answer+="L"
    #0을 누르려 할 때 #보다 7이 가깝게 계산되는 문제가 있음.
    return answer

주어진 list에 0이 있다면 11로 바꾸는 꼼수도 부려봤지만 실패했다.
그래서 이차원 배열로 바꿔 푸는데 행을 3으로 나눈 몫, 열을 3으로 나눈 나머지 +1 로 생각하려 풀려하였으나 연산과정 중 에러가 발생하였다.

그렇게 삽질하던 중.. 처음의 발상을 잘 구현시킨 코드를 발견하였다.
https://life-of-panda.tistory.com/75

가로방향으로의 거리는 abs(right(혹은 left) - num) % 3 으로, 세로방향으로의 거리는 abs(right-num)/3으로 구할 수 있으니 sum(divmod((right-num),3)) 으로 거리를 구할 수 있는 것이다!

그리고 손은 같은 경우에만 left인지 right인지 확인하면 되는 건데 처음부터 구분하려해서 볼륨만 키운 것 같다.

배열을 직접 그리기도 하며 3과 인덱스의 관계를 알았는데도 실제로 구현하기는 어려웠다.

보통은 아래처럼 딕셔너리에 좌표를 저장하고 꺼내어 사용하는 방식으로 문제를 푼 것 같다.

def solution(numbers, hand):
    answer = ''
    key_dict = {1:(0,0),2:(0,1),3:(0,2),
                4:(1,0),5:(1,1),6:(1,2),
                7:(2,0),8:(2,1),9:(2,2),
                '*':(3,0),0:(3,1),'#':(3,2)}

    left = [1,4,7]
    right = [3,6,9]
    lhand = '*'
    rhand = '#'
    for i in numbers:
        if i in left:
            answer += 'L'
            lhand = i
        elif i in right:
            answer += 'R'
            rhand = i
        else:
            curPos = key_dict[i]
            lPos = key_dict[lhand]
            rPos = key_dict[rhand]
            ldist = abs(curPos[0]-lPos[0]) + abs(curPos[1]-lPos[1])
            rdist = abs(curPos[0]-rPos[0]) + abs(curPos[1]-rPos[1])

            if ldist < rdist:
                answer += 'L'
                lhand = i
            elif ldist > rdist:
                answer += 'R'
                rhand = i
            else:
                if hand == 'left':
                    answer += 'L'
                    lhand = i
                else:
                    answer += 'R'
                    rhand = i

    return answer

좋은 웹페이지 즐겨찾기