키패드 누르기
수학지식을 잃어버린 나에게 주는 선물과도 같은 문제였다.
이 새끼는 기울기를 계산을 못해서 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)