[프로그래머스] 2020 KAKAO 인턴십 (Lv1) : 키패드 누르기
오늘은 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 ] 의 값들은 양손에서 가까운 거리를 계산해야 되므로
- 현재 누를 값 - 왼쪽 위치한 값 , 현재 누를 값 - 오른쪽 위치한 값 -> 두 값을 거리 계산이니까 절댓값을 씌워서 계산
- 3으로 나눈 몫 (위 or 아래로 한칸) + 3으로 나눈 나머지 (왼 or 오른쪽으로 한칸) 실제 떨어진 값을 계산
- 각각 두 값을 계산해서 더해 최종 어느쪽이 더 작은지 (가까운지) 계산


이 부분만 잘 계산한다면, 나머지 조건은 쉽게 해결하여 작성할 수 있습니다.
단순하게 어디있는지 보고 값을 바꾸면 되니까요!
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) |