문제 링크
https://programmers.co.kr/learn/courses/30/lessons/67256
문제 설명
스마트폰 전화 키패드의 각 칸에 다음과 같이 숫자들이 적혀 있습니다.
이 전화 키패드에서 왼손과 오른손의 엄지손가락만을 이용해서 숫자만을 입력하려고 합니다.
맨 처음 왼손 엄지손가락은 * 키패드에 오른손 엄지손가락은 # 키패드 위치에서 시작하며, 엄지손가락을 사용하는 규칙은 다음과 같습니다.
- 엄지손가락은 상하좌우 4가지 방향으로만 이동할 수 있으며 키패드 이동 한 칸은 거리로 1에 해당합니다.
- 왼쪽 열의 3개의 숫자 1, 4, 7을 입력할 때는 왼손 엄지손가락을 사용합니다.
- 오른쪽 열의 3개의 숫자 3, 6, 9를 입력할 때는 오른손 엄지손가락을 사용합니다.
- 가운데 열의 4개의 숫자 2, 5, 8, 0을 입력할 때는 두 엄지손가락의 현재 키패드의 위치에서 더 가까운 엄지손가락을 사용합니다.
4-1. 만약 두 엄지손가락의 거리가 같다면, 오른손잡이는 오른손 엄지손가락, 왼손잡이는 왼손 엄지손가락을 사용합니다.
순서대로 누를 번호가 담긴 배열 numbers, 왼손잡이인지 오른손잡이인 지를 나타내는 문자열 hand가 매개변수로 주어질 때, 각 번호를 누른 엄지손가락이 왼손인 지 오른손인 지를 나타내는 연속된 문자열 형태로 return 하도록 solution 함수를 완성해주세요.
제한 사항
- numbers 배열의 크기는 1 이상 1,000 이하입니다.
- numbers 배열 원소의 값은 0 이상 9 이하인 정수입니다.
- hand는 "left" 또는 "right" 입니다.
- "left"는 왼손잡이, "right"는 오른손잡이를 의미합니다.
- 왼손 엄지손가락을 사용한 경우는 L, 오른손 엄지손가락을 사용한 경우는 R을 순서대로 이어 붙여 문자열 형태로 return 해주세요.
입출력 예시
입출력 설명
입출력 예 #1
왼손 위치 오른손 위치 눌러야 할 숫자 사용한 손 설명
* | # | 1 | L | 1은 왼손으로 누릅니다. |
1 | # | 3 | R | 3은 오른손으로 누릅니다. |
1 | 3 | 4 | L | 4는 왼손으로 누릅니다. |
4 | 3 | 5 | L | 왼손 거리는 1, 오른손 거리는 2이므로 왼손으로 5를 누릅니다. |
5 | 3 | 8 | L | 왼손 거리는 1, 오른손 거리는 3이므로 왼손으로 8을 누릅니다. |
8 | 3 | 2 | R | 왼손 거리는 2, 오른손 거리는 1이므로 오른손으로 2를 누릅니다. |
8 | 2 | 1 | L | 1은 왼손으로 누릅니다. |
1 | 2 | 4 | L | 4는 왼손으로 누릅니다. |
4 | 2 | 5 | R | 왼손 거리와 오른손 거리가 1로 같으므로, 오른손으로 5를 누릅니다. |
4 | 5 | 9 | R | 9는 오른손으로 누릅니다. |
4 | 9 | 5 | L | 왼손 거리는 1, 오른손 거리는 2이므로 왼손으로 5를 누릅니다. |
5 | 9 | - | - |
따라서 "LRLLLRLLRRL"를 return 합니다.
입출력 예 #2
왼손잡이가 [7, 0, 8, 2, 8, 3, 1, 5, 7, 6, 2]를 순서대로 누르면 사용한 손은 "LRLLRRLLLRR"이 됩니다.
입출력 예 #3
오른손잡이가 [1, 2, 3, 4, 5, 6, 7, 8, 9, 0]를 순서대로 누르면 사용한 손은 "LLRLLRLLRL"이 됩니다.
패드를 통해서 구해야 하는 것은 왼손으로 누를 것인지, 오른손으로 누를 것인지입니다.
왼손과 오른손의 시작 위치인 *과 #을 제외하였을 때,
무조건 왼손인 경우는 1, 4, 7
무조건 오른손인 경우는 3, 6, 9
그리고 조건에 따라 왼손과 오른손이 결정되는 2, 5, 8, 0이 있습니다.
조건에는 2가지 경우가 있습니다.
먼저, 더 가까이 있는 손이 2, 5, 8, 0의 패드를 누르는 경우입니다.
마지막으로, 같은 거리에 있을 때 "주로 사용하는 손"으로 누르는 경우입니다.
두 조건의 공통점은 "거리"입니다.
따라서 조건에서 거리 계산 결과에 대한 처리를 다루어야 합니다.
입출력 설명에서는 패드와 손의 위치 거리를 좌표의 거리로 계산할 수 있도록 했습니다.
서로 같은 가로, 세로에 위치할 때는 거리가 1,
서로 대각선에 위치할 때는 거리가 2이기 때문입니다.
따라서 (x, y) 구조의 좌표로 키 패드를 구성하면 수월하게 문제 해결을 할 수 있었습니다.
def solution(numbers, hand):
pad = { '*' : (0,0), '0' : (0,1), '#' : (0,2), # 키 패드 값을 딕셔너리 구조로 정의
'7' : (1,0), '8' : (1,1), '9' : (1,2),
'4' : (2,0), '5' : (2,1), '6' : (2,2),
'1' : (3,0), '2' : (3,1), '3' : (3,2)
}
L_pos = pad['*'] # 처음 왼손 키패드 위치
R_pos = pad['#'] # 처음 오른손 키패드 위치
answer = [] # 최종 출력에 사용하는 리스트
for number in numbers:
if number in (1, 4, 7):
answer.append("L")
L_pos = pad[str(number)] # 1, 4, 7은 무조건 왼손
elif number in (3, 6, 9):
answer.append("R")
R_pos = pad[str(number)] # 3, 6, 9는 무조건 오른손
else:
a = abs(L_pos[0] - pad[str(number)][0]) +\
abs(L_pos[1] - pad[str(number)][1]) # 왼손과 다음 버튼의 거리
b = abs(R_pos[0] - pad[str(number)][0]) +\
abs(R_pos[1] - pad[str(number)][1]) # 오른손과 다음 버튼의 거리
if a > b : # 왼손 거리 > 오른손 거리
answer.append("R")
R_pos = pad[str(number)]
elif a < b : # 왼손 거리 < 오른손 거리
answer.append("L")
L_pos = pad[str(number)]
else: # 거리가 같으면 주로 사용하는 손
if hand == "right":
answer.append("R")
R_pos = pad[str(number)]
else:
answer.append("L")
L_pos = pad[str(number)]
answer = ''.join(answer)
return answer
- 끝 -
'작업 > Problem Solving' 카테고리의 다른 글
프로그래머스 코딩 테스트 연습 (로또의 최고 순위와 최저 순위) - Python3 (0) | 2021.07.31 |
---|---|
프로그래머스 코딩 테스트 (내적) - Python3 (0) | 2021.07.31 |
프로그래머스 코딩 테스트 (음양 더하기) - Python3 (0) | 2021.07.31 |
백준 9815(Cabric Number Problem) 파이썬(python) 해결 (0) | 2021.06.28 |
백준 1032(명령 프롬프트) 파이썬(python) 해결 (0) | 2021.05.15 |