알고리즘 풀이/프로그래머스

[Level 1] 키패드 누르기

mhko411 2021. 7. 31. 13:04
728x90

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


접근

딕셔너리를 활용하여 각 번호를 key, 번호의 좌표를 value로 저장한다. 

이후 해당 번호에 따라서 왼손과 오른손의 좌표를 이동하고 조건에 따라 최종해에 L과 R을 추가한다.

이렇게 번호의 좌표를 딕셔너리에 저장한 이유는 2, 5, 8, 0일 때 더 가까운 손으로 눌러야하기 때문이다.

 

구현

- 일단 2차원 리스트인 board에 키패드의 모양대로 저장한다.

- 이제 board를 탐색하여 key_pos라는 딕셔너리에 번호를 key, 좌표를 value로 저장한다.

- 초기에 left, right에 왼손과 오른손의 위치를 저장하고

- 입력된 번호를 탐색한다.

- 1, 4, 7일 때는 answer에 L을 추가하고 left의 위치를 갱신한다.

- 3, 6, 9일 때는 answer에 R을 추가하고 right의 위치를 갱신한다.

- 위의 두 가지 조건이 아닐 때는 현재 나온 숫자와 왼손, 오른손들의 위치를 비교한다.

- 더 가까운 손을 answer에 추가하고 거리가 같을 때는 hand를 비교한다. 

def solution(numbers, hand):
    answer = ''
    board = [
        [1, 2, 3],
        [4, 5, 6],
        [7, 8, 9],
        ['L', 0, 'R']
    ]
    
    key_pos = {}
    for y in range(4):
        for x in range(3):
            key_pos[board[y][x]] = (y, x)
    
    left = key_pos['L']
    right = key_pos['R']
    
    for number in numbers:
        if number == 1 or number == 4 or number == 7:
            answer += 'L'
            left = key_pos[number]
        elif number == 3 or number == 6 or number == 9:
            answer += 'R'
            right = key_pos[number]
        # 2, 5, 8, 0 일때    
        else:
            left_dist = abs(left[0] - key_pos[number][0]) + abs(left[1] - key_pos[number][1])
            right_dist = abs(right[0] - key_pos[number][0]) + abs(right[1] - key_pos[number][1])
            if left_dist < right_dist:
                answer += 'L'
                left = key_pos[number]
            elif left_dist > right_dist:
                answer += 'R'
                right = key_pos[number]
            else:
                if hand == 'left':
                    answer += 'L'
                    left = key_pos[number]
                else:
                    answer += 'R'
                    right = key_pos[number]
            
    return answer

 

'알고리즘 풀이 > 프로그래머스' 카테고리의 다른 글

[Level 2] 뉴스 클러스터링  (0) 2021.08.29
[Level 1] 실패율  (0) 2021.08.03
[Level 1] 숫자 문자열과 영단어  (0) 2021.07.31
[Level 2] 괄호 회전하기  (0) 2021.06.15
[Level 3] 베스트 앨범  (0) 2021.06.07