KEEP GOING
[python] 프로그래머스 67256번 : 키패드 누르기 (divmod()) 본문
https://programmers.co.kr/learn/courses/30/lessons/67256
[코드 구현]
def position(Num):
global keypad
for i in range(4):
for j in range(3):
if keypad[i][j] == Num:
return [i, j]
def distance(s_x, s_y, t_x, t_y):
D = abs(s_x - t_x) + abs(s_y - t_y)
return D
def solution(numbers, hand):
global keypad
keypad = [[1, 2, 3],
[4, 5, 6],
[7, 8, 9],
[-1, 0, -1]]
left_x, left_y = 3, 0
right_x, right_y = 3, 2
answer = ''
for number in numbers:
# 왼손이 움직여야 할 경우
if number == 1 or number == 4 or number == 7:
x, y = position(number)
left_x, left_y = x, y
answer += 'L'
# 오른손이 움직여야 할 경우
elif number == 3 or number == 6 or number == 9:
x, y = position(number)
right_x, right_y = x, y
answer += 'R'
else:
x, y = position(number)
# 각거리 distance 비교후 짧은 쪽이 move
ld = distance(left_x, left_y, x, y)
rd = distance(right_x, right_y, x, y)
if ld < rd:
left_x, left_y = x, y
answer += 'L'
elif ld > rd:
right_x, right_y = x, y
answer += 'R'
else:
if hand == 'left':
left_x, left_y = x, y
answer += 'L'
else:
right_x, right_y = x, y
answer += 'R'
return answer
[코드 개선]
if number == 1 or number == 4 or number == 7:
-> if number in [1,4,7]
맨하탄 거리를 구하는 함수 distance
-> left, right = 10, 12
-> number = *일때 각각 11으로 대체 (이렇게 하면 위아래 간 간격이 3 차이 좌우로는 1 차이)
-> 번호와 주어진 숫자의 절댓값을 3으로 나눈 몫과 나머지의 합으로 거리를 구할 수 있음
1 2 3
4 5 6
7 8 9
10 11 12
4와 9의 거리 > abs(4-9) = 5
divmod(5, 3) = 1, 2 (3은 gap 차이)
맨하탄 거리 = 1 + 2 = 3
def distance(s_x, s_y, t_x, t_y):
D = abs(s_x - t_x) + abs(s_y - t_y)
return D
def solution(numbers, hand):
left, right = 10, 12
answer = ''
for number in numbers:
number = 11 if number == 0 else number
# 왼손이 움직여야 할 경우
if number in [1,4,7]:
left = number
answer += 'L'
# 오른손이 움직여야 할 경우
elif number in [3,6,9]:
right = number
answer += 'R'
else:
# 각거리 distance 비교후 짧은 쪽이 move
ld = sum(divmod(abs(left-number), 3))
rd = sum(divmod(abs(right-number), 3))
if ld < rd:
left = number
answer += 'L'
elif ld > rd:
right = number
answer += 'R'
else: # 거리가 같다면 왼손잡이인지 오른손잡이인지 확인
if hand == 'left':
left = number
answer += 'L'
else:
right = number
answer += 'R'
return answer
주어진 개념을 응용한 경우
1 2 3 4 5
6 7 8 9 10
11 12 13 14 15
16 17 18 19 20
7과 14의 맨하탄 거리 : abs(14 - 7) = 7
divmod(7, 5) = 1, 2 (5은 gap 차이)
두 숫자의 맨하탄 거리 = 1+2 = 3
[에러 발생]
# 시간을 잡아 먹은이유
# TypeError: 'int' object is not subscriptable
# 인덱스를 갖지 않는 값에 인덱스로 접근해서
# 이중배열을 만들 때 [] 안에 [] 만드는거 실수함
'code review > implementation' 카테고리의 다른 글
[python] 프로그래머스 92334번 : 신고 결과 받기 (0) | 2022.03.18 |
---|---|
[python] 프로그래머스 72410번 : 신규 아이디 추천 (isdigit(), isalpha()) (0) | 2022.03.17 |
[python] 백준 6603번 : 로또 (combination, backtracking) (0) | 2022.02.25 |
[python] SWEA 1954 : 달팽이 숫자 (0) | 2022.02.04 |
[python] 백준 19237번: 어른 상어 (0) | 2022.01.25 |