카카오 키패드 누르기
문제:
(https://programmers.co.kr/learn/courses/30/lessons/67256)
처음엔 이차원 배열을 쓰기 싫다는 마음이 강했다.
그래서 #과 *을 숫자로 대체하고 누르려고 하는 숫자와의 차의 절대값이 작은 손으로 누르는 것으로 코드를 작성하였으나 금방 문제가 발견되었다.
def solution(numbers, hand):
answer = ''
l = 10 #왼손 오른손의 위치 저장
r = 12
left = [1,4,7]
right = [3,6,9]
#목표치와의 차의 절대값 작은 손이 누름
if hand == "right":
for num in numbers:
if num in left:
l = num
answer += "L"
elif num in right:
r = num
answer += "R"
else:
if(abs(num-r) <= abs(num-l)):
r =num
answer += "R"
else:
l =num
answer+="L"
else:
for num in numbers:
if num in left:
l = num
answer += "L"
elif num in right:
r = num
answer += "R"
else:
if(abs(num-r) <abs(num-l)):
r =num
answer += "R"
else:
l =num
answer+="L"
#0을 누르려 할 때 #보다 7이 가깝게 계산되는 문제가 있음.
return answer
주어진 list에 0이 있다면 11로 바꾸는 꼼수도 부려봤지만 실패했다.
그래서 이차원 배열로 바꿔 푸는데 행을 3으로 나눈 몫, 열을 3으로 나눈 나머지 +1 로 생각하려 풀려하였으나 연산과정 중 에러가 발생하였다.
그렇게 삽질하던 중.. 처음의 발상을 잘 구현시킨 코드를 발견하였다.
https://life-of-panda.tistory.com/75
가로방향으로의 거리는 abs(right(혹은 left) - num) % 3 으로, 세로방향으로의 거리는 abs(right-num)/3으로 구할 수 있으니 sum(divmod((right-num),3)) 으로 거리를 구할 수 있는 것이다!
그리고 손은 같은 경우에만 left인지 right인지 확인하면 되는 건데 처음부터 구분하려해서 볼륨만 키운 것 같다.
배열을 직접 그리기도 하며 3과 인덱스의 관계를 알았는데도 실제로 구현하기는 어려웠다.
보통은 아래처럼 딕셔너리에 좌표를 저장하고 꺼내어 사용하는 방식으로 문제를 푼 것 같다.
def solution(numbers, hand):
answer = ''
key_dict = {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 = [1,4,7]
right = [3,6,9]
lhand = '*'
rhand = '#'
for i in numbers:
if i in left:
answer += 'L'
lhand = i
elif i in right:
answer += 'R'
rhand = i
else:
curPos = key_dict[i]
lPos = key_dict[lhand]
rPos = key_dict[rhand]
ldist = abs(curPos[0]-lPos[0]) + abs(curPos[1]-lPos[1])
rdist = abs(curPos[0]-rPos[0]) + abs(curPos[1]-rPos[1])
if ldist < rdist:
answer += 'L'
lhand = i
elif ldist > rdist:
answer += 'R'
rhand = i
else:
if hand == 'left':
answer += 'L'
lhand = i
else:
answer += 'R'
rhand = i
return answer
Author And Source
이 문제에 관하여(카카오 키패드 누르기), 우리는 이곳에서 더 많은 자료를 발견하고 링크를 클릭하여 보았다 https://velog.io/@horcrux/카카오-키패드-누르기저자 귀속: 원작자 정보가 원작자 URL에 포함되어 있으며 저작권은 원작자 소유입니다.
우수한 개발자 콘텐츠 발견에 전념 (Collection and Share based on the CC Protocol.)