알고리즘

[프로그래머스] 2020 KAKAO 인턴십 (Lv1) : 키패드 누르기

ji_iin 2022. 1. 12. 21:37

오늘은 2020년 카카오 인턴십 문제였던 "키패드 누르기" 문제를 풀어보았습니다.

1레벨임에도 비교적 다른 카카오 기출 문제 보단 시간이 필요했던 문제였던 것 같습니다.

(저만 그런가요? 😅)

살짝 수학적인 계산이 필요한 조건이 있었는데, 거기서 약간 시간이 소요된 것 같습니다.

먼저 문제의 조건을 살펴볼까요?

1. 문제

https://programmers.co.kr/learn/courses/30/lessons/67256

 

코딩테스트 연습 - 키패드 누르기

[1, 3, 4, 5, 8, 2, 1, 4, 5, 9, 5] "right" "LRLLLRLLRRL" [7, 0, 8, 2, 8, 3, 1, 5, 7, 6, 2] "left" "LRLLRRLLLRR" [1, 2, 3, 4, 5, 6, 7, 8, 9, 0] "right" "LLRLLRLLRL"

programmers.co.kr

 

2. 문제 조건

  • [ 1, 4, 7 ] 을 누를 때는 왼손으로
  • [ 3, 6, 9 ] 을 누를 때는 오른손으로  (여기까진 단순한 조건이죠)
  • [ 2, 5, 8, 0 ] 을 누를 때는 두 엄지 손가락의 현재 키패드 위치 (이전에 눌렀던 키패드 위치) 에서 더 가까운 손가락 사용!

여기서 누를 값의 위치와 현재 왼쪽, 오른쪽 키패드 위치를 각각 계산해서 더 가까운 쪽 (즉, 작은 값) 의 손가락을 사용합니다.

저는 먼저 마지막 줄의 키패드의 값을 거리 계산할 때 편의를 위해 변경하고 계산을 했는데요.

  • * = 10 = 처음 왼손가락의 위치
  • 0 = 11
  • # = 12 = 처음 오른손가락의 위치

이렇게 하면 1 ~ # 까지 거리 계산을 수학적으로 할 수 있습니다.

 

3. 예시

문제의 입출력 예처럼 8를 누르려고 하고, 왼손은 5에 오른손은 3에 위치하고 있을 때,

 

눈으로 살펴봐도 5와 8의 거리는 1 (Left)

3과 8의 거리는 3 (Right) 인 것을 쉽게 알 수 있습니다.

 

그렇다면 이 거리를 어떻게 계산해야 될까요 ??

키패드에서 위로 가면 -3 씩 아래로 가면 +3 씩 변한 값이 나오죠?

왼쪽, 오른쪽은 단순히 +1, -1 씩 바뀌게 되죠.

 

[ 2, 5, 8, 0 ] 의 값들은 양손에서 가까운 거리를 계산해야 되므로

  1. 현재 누를 값 - 왼쪽 위치한 값 , 현재 누를 값 - 오른쪽 위치한 값 -> 두 값을 거리 계산이니까 절댓값을 씌워서 계산
  2. 3으로 나눈 몫 (위 or 아래로 한칸) + 3으로 나눈 나머지 (왼 or 오른쪽으로 한칸) 실제 떨어진 값을 계산
  3. 각각 두 값을 계산해서 더해 최종 어느쪽이 더 작은지 (가까운지) 계산

위 설명한 부분의 코드입니다.
위 설명을 그림으로 표현했습니다.

이 부분만 잘 계산한다면, 나머지 조건은 쉽게 해결하여 작성할 수 있습니다.

단순하게 어디있는지 보고 값을 바꾸면 되니까요!

 

4. 코드

def solution(numbers, hand):
left_loc = 10
right_loc = 12
using_hand = ""
for val in numbers:
if val in [1,4,7]:
left_loc = val
using_hand += 'L'
elif val in [3,6,9]:
right_loc = val
using_hand += ('R')
elif val in [2,5,8,0]:
if val == 0:
val = 11 #0 = 11
ldis = abs(val-left_loc)
rdis = abs(val-right_loc)
#오른쪽이 가깝다면
if ldis // 3 + ldis % 3 > rdis // 3 + rdis % 3:
right_loc = val
using_hand += ('R')
#왼쪽이 가깝다면
elif ldis // 3 + ldis % 3 < rdis // 3 + rdis % 3:
left_loc = val
using_hand += ('L')
#거리가 같다면
elif ldis // 3 + ldis % 3 == rdis // 3 + rdis % 3:
if hand == 'left':
left_loc = val
using_hand += ('L')
else:
right_loc = val
using_hand += ('R')
return using_hand
result = solution([7, 0, 8, 2, 8, 3, 1, 5, 7, 6, 2] ,"left")
print(result)
view raw 2020-67256.py hosted with ❤ by GitHub