Algorithm
[프로그래머스 lv1] 키패드 누르기
09009
2023. 10. 10. 13:58
문제 보기
https://school.programmers.co.kr/learn/courses/30/lessons/67256
프로그래머스
코드 중심의 개발자 채용. 스택 기반의 포지션 매칭. 프로그래머스의 개발자 맞춤형 프로필을 등록하고, 나와 기술 궁합이 잘 맞는 기업들을 매칭 받으세요.
programmers.co.kr
문제 해결
완전 멍청하게 풀었는데 정답이긴 했다...
- 직접 해결한 풀이
import math
def solution(numbers, hand):
answer = ''
dic = {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_num = [1,4,7]
right_num = [3,6,9]
lh, rh = dic['*'], dic['#']
for number in numbers:
if number in left_num:
answer += 'L'
lh = dic[number]
elif number in right_num:
answer += 'R'
rh = dic[number]
else:
nx, ny = dic[number][0], dic[number][1]
if abs(nx - lh[0]) + abs(ny - lh[1]) < abs(nx - rh[0]) + abs(ny - rh[1]):
answer += 'L'
lh = dic[number]
elif abs(nx - lh[0]) + abs(ny - lh[1]) > abs(nx - rh[0]) + abs(ny - rh[1]):
answer += 'R'
rh = dic[number]
else:
if hand == "right":
answer += 'R'
rh = dic[number]
elif hand == "left":
answer += 'L'
lh = dic[number]
return answer
정답 소스 코드 (다른 사람 풀이)
def cal_dist(num, now_l, now_r, pos, handed):
x, y = 0, 1
dist_l = abs(pos[now_l][x] - pos[num][x]) + abs(pos[now_l][y] - pos[num][y])
dist_r = abs(pos[now_r][x] - pos[num][x]) + abs(pos[now_r][y] - pos[num][y])
# 거리가 같으면
if dist_l == dist_r:
return 'R' if handed == 'right' else 'L'
return 'R' if dist_l > dist_r else 'L'
def solution(numbers, hand):
answer = ''
location = {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, right = [1,4,7], [3,6,9]
handed = hand
# 손 위치
now_l, now_r = '*', '#'
for num in numbers:
if num in left:
answer += 'L'
now_l = num
elif num in right:
answer += 'R'
now_r = num
else:
answer += cal_dist(num, now_l, now_r, location, handed)
if answer[-1] == 'L':
now_l = num
else :
now_r = num
return answer