알고리즘 스터디 2021.07~

[프로그래머스] 2020 카카오 인턴십 - 키패드 누르기

문제

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

 

코딩테스트 연습 - 키패드 누르기

[1, 3, 4, 5, 8, 2, 1, 4, 5, 9, 5] "right" "LRLLLRLLRRL" [7, 0, 8, 2, 8, 3, 1, 5, 7, 6, 2] "left" "LRLLRRLLLRR" [1, 2, 3, 4, 5, 6, 7, 8, 9, 0] "right" "LLRLLRLLRL"

programmers.co.kr

 


풀이

문제에서 시키는대로 구현하면 되는 문제였다.

정말 이대로 구현하면 됐다.

이전 손의 위치가 다음 번호를 누를 손을 결정할 때 필요하기 때문에 손의 위치 정보를 저장해 두기로 했다.

 

다만 1번에서 한 칸 거리를 1로 해당한다는 조건을 제대로 읽지 않아 피타고라스 공식으로 거리를 구했었다가 오류가 나서 고쳤다.

질문하기에도 나와 같은 사람들이 많았다.

실제 세계에서는 보통 직선거리로 계산하기 때문에 사람들이 착각한 것 같다.

 

def getLoc(number):
    if number == 0:
        return (2, 4)
    else:
        return ((number-1)%3 + 1, (number-1)//3 + 1)


def solution(numbers, hand):
    answer = []
    lefts = [1, 4, 7]
    rights = [3, 6, 9]
    
    leftLoc = (1, 4)
    rightLoc = (3, 4)
    
    for n in numbers:
        if n in lefts:
            answer.append('L')
            leftLoc = getLoc(n)
        elif n in rights:
            answer.append('R')
            rightLoc = getLoc(n)
        else:
            loc = getLoc(n)
            leftDistance = abs(loc[0]-leftLoc[0]) + abs(loc[1] - leftLoc[1])
            rightDistance = abs(loc[0]-rightLoc[0]) + abs(loc[1] - rightLoc[1])
            
            if leftDistance > rightDistance:
                rightLoc = getLoc(n)
                answer.append('R')
            elif rightDistance > leftDistance:
                leftLoc = getLoc(n)
                answer.append('L')
            else:
                if hand == 'right':
                    rightLoc = getLoc(n)
                    answer.append('R')
                else:
                    leftLoc = getLoc(n)
                    answer.append('L')
        
    return ''.join(answer)

 

짜다보이 이렇게 됐는데 매번 getLoc으로 저장할 필요 없이 그냥 번호로 저장해두고 사용할 때 getLoc 했으면 더 좋았을 것 같다.