오늘은 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. 코드
'알고리즘' 카테고리의 다른 글
[프로그래머스] 연습문제 - 나누어 떨어지는 숫자 배열 (0) | 2022.01.18 |
---|---|
[Python] itertools 주요 클래스 (permutations, combinations ... ) (0) | 2022.01.15 |
[Python] bisect_left, bisect_right (0) | 2022.01.11 |
[Python] 2019 KAKAO BLIND RECRUITMENT - 오픈채팅방 (0) | 2021.11.15 |
[Python] heapq 사용시 리스트를 heapify / 값 하나씩 heappush 차이점 (0) | 2021.10.11 |