[프로그래머스] - 키패드 누르기

zunzero·2022년 9월 30일
0

알고리즘(파이썬)

목록 보기
50/54

https://school.programmers.co.kr/learn/courses/30/lessons/67256

간단하게 문제를 요약하자면, (1, 4, 7)은 왼손으로 누르고 (3, 6, 9)는 오른손으로 누르고 (2, 5, 8, 0)은 가까이 있는 손으로 누르되 거리가 같으면 자기의 주손으로 누르는 것이다.

우선 내 풀이 아이디어는 아래와 같다.
(1, 4, 7)과 (3, 6, 9)는 누르는 손이 정해져있으니 코드를 짜는 게 어렵지 않았다.
(2, 5, 8, 0)이 문제였는데, 이 때는 현재 손가락의 위치와 누르려는 번호의 거리를 계산해야했다.
1과 8의 거리는 4이지만, 우리는 거리의 대소 비교만 하면 되기 때문에 굳이 정확한 거리 계산이 불필요하다고 생각했다.
따라서 번호를 누를 때마다 왼손의 위치와 오른손의 위치를 각각의 숫자로 저장했다.
예를 들어 왼손으로 1을 눌렀으면 왼손의 위치는 그냥 1로 저장해두었다.
다만, 오른손으로 누른 경우에는 누른 숫자에서 2를 빼서 저장을 해두었다.
2와 6 사이의 거리와 2와 4사이의 거리는 같은데, (6-2)와 (4-2)는 다르기 때문이다.
그래서 (3, 6, 9)를 2씩 빼서 (1, 4, 7)로 저장해둔 다음에 거리계산에 차이가 없게끔했다.

그런데 이 풀이로 문제를 푸니 틀렸다.
사실 왜 틀렸는지 모르겠다.
구글링을 통해 참고한 소스코드도 큰 논리는 나와 다르지 않았는데...

어쨋든 문제는 크게 어렵지 않았다.
정석대로 풀었어야 했는데 괜히 거리의 대소만 비교하면 된다는 꼼수를 부려서....
소스 코드는 아래와 같다.
find_distance는 내가 생각한 2를 빼서 계산하는 그런 함수인데, 틀렸다. ㅎ

def findDistance(currentN, nextN):
    keypad = {1: [0, 0], 2: [1, 0], 3: [2, 0],
             4: [0, 1], 5: [1, 1], 6: [2, 1],
             7: [0, 2], 8: [1, 2], 9: [2, 2],
             "*": [0, 3], 0: [1, 3], "#": [2, 3]}
    x1, y1 = keypad[currentN]
    x2, y2 = keypad[nextN]
    return abs(x1-x2) + abs(y1-y2)

def find_distance(currentN, nextN):
    if currentN in ('*', '#'):
        currentN = 0
    if nextN in (3, 6, 9):
        nextN -= 2
    return abs(currentN - nextN)

def solution(numbers, hand):
    answer = ''
    current_l, current_r = '*', '#'
    
    for i in numbers:
        if i in (1, 4, 7):
            answer += 'L'
            current_l = i
        elif i in (3, 6, 9):
            answer += 'R'
            current_r = i
        else:
            if findDistance(current_l, i) < findDistance(current_r, i):
                answer += 'L'
                current_l = i
            elif findDistance(current_r, i) < findDistance(current_l, i):
                answer += 'R'
                current_r = i
            else:
                if hand == 'left':
                    answer += 'L'
                    current_l = i
                else:
                    answer += 'R'
                    current_r = i

    return answer
profile
나만 읽을 수 있는 블로그

0개의 댓글