728x90
📖 문제
[프로그래머스] [카카오인턴] 키패드 누르기 (파이썬/Python)
- 난이도: Level 1
- 유형: 그리디
- 숫자 키패드를 누르는 문제이다.
- 손가락은 왼손 엄지와 오른손 엄지만 사용하며, 특정 규칙에 따라 번호를 누른다.
- numbers: 누를 번호의 순서를 담은 배열
- hand: 왼손잡이인지 오른손잡이인지 나타내는 문자열 ("left" 또는 "right")
- 각 번호를 누를 때 사용한 손을 'L', 'R'로 이어붙인 문자열을 반환해야 한다.
🔍 문제 접근
💡 문제 분석
- 키패드는 2차원 배열처럼 구성되어 있다.
- 왼쪽 열 (`1`, `4`, `7`)은 항상 왼손으로,
- 오른쪽 열 (`3`, `6`, `9`)은 항상 오른손으로 누른다.
- 가운데 열 (`2`, `5`, `8`, `0`)은 현재 손가락 위치와의 거리를 계산해 가까운 손으로 누른다.
- 만약 거리가 같다면 `hand` 값에 따라 결정한다.
💡 풀이 아이디어
- 각 키패드를 좌표값으로 변환하여 거리 계산을 한다. (맨해튼 거리: `|x1 - x2| + |y1 - y2|`)
- 왼손, 오른손의 현재 위치를 기억하면서 순차적으로 조건을 검사한다.
🔍 문제 풀이
♻️ 코드 플로우
- 키패드를 2차원 좌표로 매핑한다.
- 시작 위치는 왼손은 `*` , 오른손은 `#`이다.
- 순서대로 numbers 배열을 순회하면서:
- 왼쪽 열 숫자 → `L`
- 오른쪽 열 숫자 → `R`
- 가운데 숫자 → 거리 비교 후 결정
- 각 경우에 따라 손 위치 갱신
- 누른 손을 문자열로 이어붙여 최종 반환
🚩 제출한 소스 코드
def solution(numbers, hand):
answer = ''
pad = {'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),
'*':(3,0), '0':(3,1), '#':(3,2)
}
left = pad['*']
right = pad['#']
for num in numbers:
# 왼손이 눌러야 하는 번호
if num in (1, 4, 7):
answer += 'L'
left = pad[str(num)]
# 오른손이 눌러야 하는 번호
elif num in (3, 6, 9):
answer += 'R'
right = pad[str(num)]
# 가운데 번호일 경우 (2, 5, 8, 0)
else:
# 해당 번호와 왼손 거리
left_dist = abs(left[0] - pad[str(num)][0]) + abs(left[1] - pad[str(num)][1])
# 해당 번호와 오른손 거리
right_dist = abs(right[0] - pad[str(num)][0]) + abs(right[1] - pad[str(num)][1])
# 더 가까운 거리
if left_dist < right_dist:
answer += 'L'
left = pad[str(num)]
elif left_dist > right_dist:
answer += 'R'
right = pad[str(num)]
# 왼손과 오른손 거리가 같을 경우
else:
if hand == 'right':
answer += 'R'
right = pad[str(num)]
else:
answer += 'L'
left = pad[str(num)]
return answer
💡회고
- 전형적인 그리디 & 구현 문제라고 생각한다. 그리디 전략을 기반으로 조건을 분기해 처리하면 된다. 처음에는 조건이 많아 어려워보였지만 규칙에 따라 풀이하면 되는 것 같다.
- 핸드폰 키패드를 2차원 배열 좌표로 생각하면 된다는 아이디어가 핵심이었던 것 같다.
728x90
'Coding Practice > Programmers' 카테고리의 다른 글
[프로그래머스] # 프렌즈4블록 (파이썬/Python) (1) | 2025.07.06 |
---|---|
[프로그래머스] #완주하지 못한 선수 (자바/Java) (2) | 2025.07.04 |
[프로그래머스] #구명보트 (자바/Java) (1) | 2025.06.28 |
[프로그래머스] #디스크 컨트롤러 (파이썬/Python) (1) | 2025.06.08 |
[2022카카오테크인턴십] 성격유형 검사하기 (Python / 파이썬) (2) | 2023.10.09 |