TIL-44. [코딩테스트] 프로그래머스 lv1. 키패드 누르기

solarrrrr·2022년 1월 15일
0

Today I Learned

목록 보기
44/74

프로그래머스 lv1 키패드 누르기 문제 풀어보았다.
1, 4, 7은 왼손 엄지
3, 6, 9는 오른손 엄지
2 ,5, 8, 0은 상하좌우 중 가까운 곳에 있는 엄지로 누르는 문제이고
만일 상하좌우에 가까운 엄지가 없으면 주력 손(오른손잡이, 왼손잡이)으로
눌러야 하며 임의의 숫자와 주력 손 정보가 인자로 주어진다.

이 문제의 포인트는 현재 엄지들의 위치가 어디이며
2, 5, 8, 0을 누를 때의 처리이다.

2, 5, 8, 0을 누를 때 주변키(상하좌우)에
양손 엄지가 다 있거나 아예 없으면 주력 손으로 적어주고
하나만 있을 땐 그 손가락을 적어주면 된다.

내 풀이법은 리스트에 들어 있는 임의의 숫자들을 하나씩 꺼내어
왼손인지 오른손인지 구분하고
별도로 현재 엄지 위치 확인을 위한 갱신형 딕셔너리를 만들었다.

LRPos = {"L" : 4, "R" : 9}

이런 식으로 만들어놓고 가운데 번호들이 등장하면
주변키를 if문으로 하나하나 비교했는데 이게 소스가 너무나 지저분해지기 시작했다.

원래 if i == (1|4|7) 이런 식으로 '파이프' 기호를 쓸 수 있는 줄 알았는데 파이썬에서는 이러면 i의 값을 확인하는 게 아니라 type을 확인한다는 걸 이번에 알았다. (헐!)

결국 i == 1 or if == 4 of if == 7
이런 식으로 다 적어줘야 했는데 이게 너무 소스가 길어지고 보기가 싫었다.

그래서 다른 분들이 어떻게 했나 봤는데 신박한 답들이 많았지만
가장 많은 추천을 받은 코드를 가져와 봤다.

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

번호판을 인덱스를 매긴 후 좌표화해서 풀이한 것인데
현재 엄지의 위치와 눌러야 할 번호에 해당하는 위치를
별도의 계산식을 이용해 몇 칸 차이나는지를 계산하는 방식이
재미있었던 것 같다.

profile
몰입

0개의 댓글