daniel7481의 개발일지

[프로그래머스]키패드 누르기(2020 카카오 인턴쉽) 본문

프로그래머스

[프로그래머스]키패드 누르기(2020 카카오 인턴쉽)

daniel7481 2022. 8. 12. 14:02
반응형

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

 

프로그래머스

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

programmers.co.kr

풀이

카카오 문제들은 레벨1이라도 방심하면 안되는 것 같다. 어떻게 풀지는 금방 생각해냈지만, 구현하는데 시간이 꽤 걸렸다. 일단 키패드는 딕셔너리 자료구조를 이용하여 각 번호에 해당하는 좌표를 설정해주었다. 그 다음 문제에서 나타난대로 1, 4, 7이면 L을 answer에 더해주고 왼쪽 엄지의 위치를 바꿔주었고, 3, 6, 9일때는 오른쪽 엄지로 바꿔주었다. 가운데 줄이면 문제에서 나온 그대로 맨해튼 거리를 계산해주고(여기서 절대값을 취해주어야한다) 더 거리가 짧은 엄지에 따라 바꿔주고 만약 거리가 같다면 오른손잡이인지 왼손잡이인지에 따라 answer 문자열에 더해주면 된다.

def solution(numbers, hand):
    answer = ''
    l_pos = [3, 0]
    r_pos = [3, 2]
    coor = dict()
    coor[0] = [3 ,1]
    row = 0
    for i in range(1, 10, 3):
        for j in range(3):
            coor[i+j] = [row, j]
        row += 1
    #print(coor)
    for n in numbers:
        #print(l_pos, r_pos)
        if n == 1 or n == 4 or n == 7:
            answer += 'L'
            l_pos = coor[n]
        elif n == 3 or n == 6 or n == 9:
            answer += 'R'
            r_pos = coor[n]
        else:
            l_dis = abs(l_pos[0] - coor[n][0]) + abs(l_pos[1] - coor[n][1])
            r_dis = abs(r_pos[0] - coor[n][0]) + abs(r_pos[1] - coor[n][1])
            if l_dis < r_dis:
                answer += 'L'
                l_pos = coor[n]
            elif r_dis < l_dis:
                answer += 'R'
                r_pos = coor[n]
            else:
                if hand == "right":
                    answer += 'R'
                    r_pos = coor[n]
                else:
                    answer += 'L'
                    l_pos = coor[n]
    return answer
반응형