김찬양의 개발일지
32일차. [카카오 인턴] 키패드 누르기 본문
링크
https://school.programmers.co.kr/learn/courses/30/lessons/67256
문제
정답
def solution(numbers, hand):
answer = ''
left = 10
right = 12
for number in numbers:
if number == 0:
number = 11
if number in [1, 4, 7]:
answer += 'L'
left = number
elif number in [3, 6, 9]:
answer += 'R'
right = number
else:
number_x = (number-1)%3
number_y = (number-1)//3
left_x = (left-1)%3
left_y = (left-1)//3
right_x = (right-1)%3
right_y = (right-1)//3
left_len = abs(number_x-left_x)+abs(number_y-left_y)
right_len = abs(number_x-right_x)+abs(number_y-right_y)
if left_len < right_len:
answer += 'L'
left = number
elif left_len > right_len:
answer += 'R'
right = number
else:
if hand == 'right':
answer += 'R'
right = number
else:
answer += 'L'
left = number
return answer
풀이과정
문제를 간소화하는 전략이 필요하다. 먼저 1, 4, 7은 왼손으로 누른다.
if number in [1, 4, 7]:
answer += 'L'
left = number
그리고 3, 6, 9는 오른손으로 누른다.
if number in [3, 6, 9]:
answer += 'R'
right = number
자 그러면 중앙 2580이 문제인데, 딕셔너리를 이용해 좌표를 저장하는 방법도 잇지만, 여기서는 직접 계산하는방법을 쓰기로햇다.
먼저 0을 11, *을 10, #을 12로 가정하면,
left = 10
right = 12
if number == 0:
number = 11
각 숫자의 위치는 위아래 = (숫자-1)//3, 좌우 = (숫자-1)%3가 된다. 그러면,
number_x = (number-1)%3
number_y = (number-1)//3
left_x = (left-1)%3
left_y = (left-1)//3
right_x = (right-1)%3
right_y = (right-1)//3
자 이제 그러면 거리를 구하고 비교하자. 가까운쪽으로 누른다.
left_len = abs(number_x-left_x)+abs(number_y-left_y)
right_len = abs(number_x-right_x)+abs(number_y-right_y)
if left_len < right_len:
answer += 'L'
left = number
elif left_len > right_len:
answer += 'R'
right = number
마지막으로 이마저도 거리가 같다면, 그사람의 주 사용 손에따라 갈리면 된다.
if hand == 'right':
answer += 'R'
right = number
else:
answer += 'L'
left = number
딕셔너리를 사용하지 않고 풀고싶어서(적기 귀찮아서) 햇지만, 딕셔너리가 더 깔끔한 코드가 될 것 같다.(+ 거리를 구하는 함수를 따로 뺴는것도 좋아보인다.)
'코딩테스트 > Programmers Level 1' 카테고리의 다른 글
34일차. 체육복 (1) | 2023.12.29 |
---|---|
33일차. K번째수 (0) | 2023.12.28 |
31일차. 두 개 뽑아서 더하기 (0) | 2023.12.25 |
30일차. 3진법 뒤집기 (0) | 2023.12.24 |
29일차. 내적 (0) | 2023.12.24 |