Algorithm
프로그래머스
Python
키패드 누르기

키패드 누르기

문제 링크 (opens in a new tab)

수학지식을 잃어버린 나에게 주는 선물과도 같은 문제였다.
이 새끼는 기울기를 계산을 못해서 bfs로 풀었다는게 정말 레전드를 찍은 문제인거 같다.

내 풀이

from collections import deque
 
def bfs(graph, cur_v, target) :
    _d = [[1,0], [-1,0], [0,1], [0,-1]]
    R, C = len(graph), len(graph[0])
    q = deque()
    q.append(cur_v)
    while q :
        cr, cc, c_cost = q.popleft()
        if [cr, cc] == target :
            return c_cost
        for d in _d :
            nr, nc = cr + d[0], cc + d[1]
            if -1 < nr < R and -1 < nc < C :
                q.append([nr,nc,c_cost + 1])
        
    return -1
 
def solution(numbers, hand):
    answer = ""
    graph = [[i + j * 3 for i in range(1, 4)] for j in range(3)] + [["*", 0, "#"]]
    htb = {}
    R, C = len(graph), len(graph[0])
    for r in range(R) :
        for c in range(C) :
            htb[graph[r][c]] = [r,c]
    left, right = [3,0],[3,2]
    for n in numbers :
        if n in [1,4,7] : 
            left = htb[n]
            answer += "L"
        elif n in [3,6,9] :
            right = htb[n]
            answer += "R"
        else :
            lcost = bfs(graph, left + [0], htb[n])
            rcost = bfs(graph, right + [0], htb[n])
            if lcost > rcost :
                right = htb[n]
                answer += "R"
            elif rcost > lcost : 
                left = htb[n]
                answer += "L"
            else :
                if hand == "right" :
                    right = htb[n]
                    answer += "R"
                else :
                    left = htb[n]
                    answer += "L"
            
    return answer

다른 사람 풀이

def solution(numbers, hand):
    answer = ''
	
    #키패드 위치
    pad = {'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 = pad['*']   #처음 왼손의 위치
    right = pad['#']  #처음 오른손의 위치
    
    for num in numbers :
    	#왼손이 누를 번호
        if num == 1 or num == 4 or num == 7 :
            answer += 'L'          #answer에 'L' 저장
            left = pad[str(num)]   #해당 번호를 눌렀을 때 왼손의 위치 저장
        
        #오른손이 누를 번호
        elif num == 3 or num == 6 or num == 9 :
            answer += 'R'            #answer에 'R' 저장
            right = pad[str(num)]    #해당 번호를 눌렀을 때 오른손의 위치 저장
        
        #번호가 2,5,8,0일 때
        else :
        	#번호와 왼손의 거리 계산
            left_dis = abs(left[0] - pad[str(num)][0]) + abs(left[1] - pad[str(num)][1])
            #번호와 오른손의 거리 계산
            right_dis = abs(right[0] - pad[str(num)][0]) + abs(right[1] - pad[str(num)][1])
            
            #왼손이 더 가까울 때
            if left_dis < right_dis :
                answer += 'L'
                left = pad[str(num)]
            
            #오른손이 더 가까울 때
            elif left_dis > right_dis :
                answer += 'R'
                right = pad[str(num)]
            
            #왼손과 오른손 거리가 같을 때
            else :
                if hand == 'right' :
                    answer += 'R'
                    right = pad[str(num)]
                else :
                    answer += 'L'
                    left = pad[str(num)]
    
    return answer

Reference

https://iambeginnerdeveloper.tistory.com/106 (opens in a new tab)