일 | 월 | 화 | 수 | 목 | 금 | 토 |
---|---|---|---|---|---|---|
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 |
31 |
- SW Expert Academy
- Git
- 우분투
- 자연어처리
- 캐치카페
- Baekjoon
- 프로그래머스
- 데이콘
- 편스토랑 우승상품
- Real or Not? NLP with Disaster Tweets
- github
- gs25
- 금융문자분석경진대회
- 더현대서울 맛집
- 파이썬
- AI 경진대회
- ubuntu
- Docker
- 편스토랑
- ChatGPT
- leetcode
- PYTHON
- dacon
- 프로그래머스 파이썬
- Kaggle
- programmers
- 백준
- 맥북
- 코로나19
- hackerrank
- Today
- Total
솜씨좋은장씨
[Programmers] 2020 카카오 인턴십 - 키패드 누르기 (Python) 본문
코딩 1일 1문제! 오늘의 문제는 2020 카카오 인턴십 문제였던 프로그래머스의 키패드 누르기 입니다!
오늘은 날씨가 좋아 해방촌 남산아래라는 카페에서 따사로운 햇살을 맞으며 문제를 풀어보았습니다.
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에 더해주도록 하였습니다.
'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 |