일 | 월 | 화 | 수 | 목 | 금 | 토 |
---|---|---|---|---|---|---|
1 | 2 | 3 | 4 | 5 | ||
6 | 7 | 8 | 9 | 10 | 11 | 12 |
13 | 14 | 15 | 16 | 17 | 18 | 19 |
20 | 21 | 22 | 23 | 24 | 25 | 26 |
27 | 28 | 29 | 30 |
- github
- PYTHON
- 편스토랑 우승상품
- AI 경진대회
- Kaggle
- leetcode
- 자연어처리
- Docker
- 파이썬
- ubuntu
- 우분투
- gs25
- programmers
- ChatGPT
- Real or Not? NLP with Disaster Tweets
- hackerrank
- 캐치카페
- 코로나19
- 데이콘
- 맥북
- 더현대서울 맛집
- SW Expert Academy
- 편스토랑
- dacon
- 금융문자분석경진대회
- 백준
- 프로그래머스
- Baekjoon
- 프로그래머스 파이썬
- Git
- Today
- Total
솜씨좋은장씨
[Programmers] 2020 카카오 인턴십 - 키패드 누르기 (Python) 본문

코딩 1일 1문제! 오늘의 문제는 2020 카카오 인턴십 문제였던 프로그래머스의 키패드 누르기 입니다!
오늘은 날씨가 좋아 해방촌 남산아래라는 카페에서 따사로운 햇살을 맞으며 문제를 풀어보았습니다.
코딩테스트 연습 - 키패드 누르기
[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
Solution
def get_distance(keypad, finger_position, next_number):
next_number_position = keypad[next_number]
distance = abs(finger_position[0] - next_number_position[0]) + abs(finger_position[1] - next_number_position[1])
return distance
def solution(numbers, hand):
result = ''
keypad = {
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],
0: [3, 1]
}
left_finger_numbers = [1, 4, 7]
right_finger_numbers = [3, 6, 9]
center_finger_numbers = [2, 5, 8, 0]
left_finger_position = [3, 0]
right_finger_position = [3, 2]
for number in numbers:
if number in left_finger_numbers:
result += 'L'
left_finger_position = keypad[number]
elif number in right_finger_numbers:
result += 'R'
right_finger_position = keypad[number]
else:
left_finger_distance = get_distance(keypad, left_finger_position, number)
right_finger_distance = get_distance(keypad, right_finger_position, number)
if left_finger_distance > right_finger_distance:
result += 'R'
right_finger_position = keypad[number]
elif left_finger_distance < right_finger_distance:
result += 'L'
left_finger_position = keypad[number]
elif left_finger_distance == right_finger_distance:
result += hand[0].upper()
if hand == 'right':
right_finger_position = keypad[number]
elif hand == 'left':
left_finger_position = keypad[number]
return result
Solution 풀이
3X4로 이루어진 키패드의 좌표를 keypad라는 dictionary로 하나 선언하여 각각의 번호를 키로 활용하여 그 번호의 좌표를 가져올 수 있도록 하였습니다.
그리고 각각 왼손이 클릭해야하는 번호 오른손이 클릭해야하는 번호를
왼손은 left_finger_nubmers 오른손은 right_finger_numbers로 선언해 두었습니다.
그리고 처음 손가락의 포지션은 왼손은 * 오른손은 # 이므로 각각 해당하는 좌표를 넣어 두었습니다.
이제 입력해야하는 번호목록에서 번호를 하나씩 불러옵니다.
만약 오른손이 눌러야하는 번호인 3, 6, 9 중에 하나인 번호거나 왼손이 눌러야하는 1, 4, 7 중에 하나라면
각각 R과 L을 정답에 넣어주도록하고
그렇지 않은 경우에는 현재 손가락과 다음에 눌러야하는 손가락의 거리를 왼손, 오른손 각각 구합니다.
여기서 거리를 구하는 방법은 두 번호 사이의 x, y 좌표 차이를 더한 만큼입니다.
만약 오른손 손가락의 번호가 3 -> 위치 (0, 2)
그리고 다음에 눌러야하는 번호가 5라면 -> 위치 (1, 1)
오른손 손가락의 번호와 다음에 눌러야하는 번호와의 거리는 (0-1) 의 절대값인 1과 (2-1)의 절대값인 1을 더한 2가 됩니다.
이렇게 각각 왼손과 오른손의 다음 번호와의 거리를 구해 더 가까운 손가락의 문자를 result에 더해주었고
만약 같을 경우에는 이 키패드를 입력하는 사람이 사용하는 손을 따라가기로 하여
오른손 잡이면 R을 왼손잡이면 L을 result에 더해주도록 하였습니다.

SOMJANG/CODINGTEST_PRACTICE
1일 1문제 since 2020.02.07. Contribute to SOMJANG/CODINGTEST_PRACTICE development by creating an account on GitHub.
github.com
'Programming > 코딩 1일 1문제' 카테고리의 다른 글
[Programmers] 행렬의 곱셈 (Python) (0) | 2021.05.07 |
---|---|
[Programmers] JadenCase 문자열 만들기 (Python) (0) | 2021.05.06 |
[Programmers] 시저 암호 (Python) (0) | 2021.05.04 |
[Programmers] 예산 (Python) (0) | 2021.05.03 |
[BaekJoon] 소트인사이드 (Python) (0) | 2021.05.02 |