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

Mr.Frog·2022년 8월 15일
0

공부일지

목록 보기
7/7
post-thumbnail

레벨 1이라고 해서 무시했는데 생각보다 시간이 걸린 문제다.
다른 사람들의 풀이를 보니 패드를 전부 좌표로 옮겨서 거리를 구하는 것이 대세인 듯하다. 하지만 조금 다른 풀이도 있지 않을까 해서 공유해본다.

위의 사진을 보면 가로로는 1씩 증가하고 세로로는 3씩 증가하는 것을 알 수 있다. 숫자 계산을 이용한 풀이를 위해 '*' 나 '#' 와 같은 문자열은 숫자가 아니므로 규칙에 맞게 10과 12로 바꾸어 주었다. 또한 0도 11로 바꾸었다. 바꾸고 난 뒤의 패드는 아래와 같다.

123
456
789
101112

막상 바꾸고 나니 패드상에서 번호 간의 거리를 구하는 것이 문제였는데 꽤나 고민한 끝에 아래의 수식으로 해결했다. a와 b 사이의 거리를 구한다고 하였을 때,

abs(a-b)//3 + abs(a-b)%3

둘 사이의 거리의 절댓값을 3으로 나눈 몫과 나머지를 더해주면 우리가 원하는 거리를 계산할 수 있다!
이는 숫자들의 차이가 처음에도 말했듯이 세로로는 3씩 증가하고 가로로는 1씩 증가하기 때문이다. 즉, 같은 행의 숫자들의 최대 차이는 2이므로 3으로 나눈 나머지에 부합한다. 위와 같은 계산은 시작점에서 도착점까지 세로로 최대한 이동한 뒤 남은 거리를 가로로 이동하는 방식과 같다.

코드를 보면 생각보다 복잡하지 않다.

def solution(numbers, hand):
    answer = ''
    lp = 10    # 왼손 위치. 처음 위치가 '*'이므로 10으로 바꿈
    rp = 12	   # 오른손 위치. 처음 위치가 '#'이므로 12로 바꿈
    for i in numbers:  
    	# 누른 번호가 1,4,7 일 때
        if i in [1,4,7]:
            lp = i
            answer+='L'
        # 누른 번호가 3,6,9 일 때
        elif i in [3,6,9]:
            rp = i
            answer += 'R'
        # 누른 번호가 2,5,8,0 일 때
        else:
            if i == 0: i = 11    # 0을 11로 바꿈
            ld = abs(i-lp)//3 + abs(i-lp)%3    # 왼손과의 거리
            rd = abs(i-rp)//3 + abs(i-rp)%3    # 오른손과의 거리
            if ld < rd: 
                lp = i
                answer += 'L'
            elif ld > rd:
                rp = i
                answer += 'R'
            else:
                if hand == 'right':    # 오른손잡이라면
                    rp = i
                    answer += 'R'
                else:
                    lp = i
                    answer += 'L'
    return answer

이 풀이는 패드가 생각 이상으로 커졌을 때 써먹을 수 있지 않을까 싶다.
또한 divmod를 사용하면 조금 더 깔끔하게 바꿀 수 있을 것 같기도 하다.

profile
코딩 배우는 개구리

0개의 댓글