📝 문제

💡 스마트폰 전화 키패드의 각 칸에 다음과 같이 숫자들이 적혀 있습니다.
사용 손가락 : 왼손 & 오른손의 엄지손가락만 사용해서 숫자만을 입력하고자 함!!
시작점 : 왼손 엄지손가락은 * 키패드, 오른손 엄지손가락은 # 키패드 위치에서 시작!
엄지손가락 사용 규칙
- 엄지손가락은 상/하/좌/우 4가지 방향으로만 이동할 수 있으며, 이동 한 칸은 거리 1에 해당.
- 왼쪽 열의 3개의 숫자 1, 4, 7을 입력할 때에는 왼손 엄지손가락을 사용
- 오른쪽 열의 3개의 3,6,9를 ㅇ비력할 때에는 오른손 엄지손가락을 사용
- 가운데 열의 4개의 숫자 2, 5, 8, 0을 입력할 때에는 두 손 중에서 엄지손가락의 현재 키패드의 위치에서 더 가까운 엄지손가락을 사용을 함.
- 만약에 두 엄지손가락의 거리가 같다면, 오른손잡이는 오른손 엄지손가락을, 왼손잡이는 왼손 엄지손가락을 사용함.
[제한사항]
- numbers 배열의 크기는 1이상 1000이하
- numbers 배열 원소의 값은 0이상 9이하인 정수
- hand는 "left" or "right"임 (left : 왼손잡이, right : 오른손잡이)
- 왼손 엄지손가락을 사용한 경우 : L 문자열 사용
- 오른손 엄지손가락을 사용한 경우 : R 문자열 사용
프로그래머스
코드 중심의 개발자 채용. 스택 기반의 포지션 매칭. 프로그래머스의 개발자 맞춤형 프로필을 등록하고, 나와 기술 궁합이 잘 맞는 기업들을 매칭 받으세요.
programmers.co.kr
✅ 풀이
def solution(numbers, hand):
answer = ''
array = [[1,2,3],[4,5,6],[7,8,9],['*',0,'#']]
num = 1
l = [1, 4, 7]
r = [3, 6, 9]
lf = [3,0]
rf = [3,2]
point = [0,0]
for items in numbers:
if items in l:
answer += 'L'
lf = [l.index(items), 0]
elif items in r:
answer += 'R'
rf = [r.index(items), 2]
else:
point = [[i, j] for i in range(4) for j in range(3) if array[i][j] == items][0]
ld = abs(point[0]-lf[0]) + abs(point[1]-lf[1])
rd = abs(point[0]-rf[0]) + abs(point[1]-rf[1])
if ld > rd:
answer += 'R'
rf = point
elif rd > ld:
answer += 'L'
lf = point
else:
if hand == 'right':
answer += 'R'
rf = point
else:
answer += 'L'
lf = point
print(lf, rf)
return answer
💡 자나깨나 인덱스 조심.. 인덱스 바꿔써서 왜 안되나 하고 엄청 머리가 아팠다..
왼손가락의 위치를 lf, 오른손가락의 위치를 rf, 그리고 눌러야 할 가운데 라인 번호의 위치를 point로 초기화 하였다.
[1,4,7], [3,6,9]를 누르는 경우는 간단하니까 생략하고, [2,5,8]을 누르는 경우가 문제였는데,
이 부분은 아래 코드를 사용해서 해결했다.
"[[i, j] for i in range(4) for j in range(3) if array[i][j] == items][0]"
[2,5,8]이 위치하고 있는 인덱스를 리스트 형태인 [i,j]로 반환해주는 코드다.
반환받은 인덱스와 현재 왼손, 오른손의 위치간 거리를 계산해서 이후 작업을 구현했다.
왜 자꾸 인덱스 에러가 나나 했더만.. 행과 열의 인덱스를 바꿔쓰는 만행을 저질러버렸다..😂😂😂
그래도 해결해서 기분은 좋다!
📝 문제

💡 스마트폰 전화 키패드의 각 칸에 다음과 같이 숫자들이 적혀 있습니다.
사용 손가락 : 왼손 & 오른손의 엄지손가락만 사용해서 숫자만을 입력하고자 함!!
시작점 : 왼손 엄지손가락은 * 키패드, 오른손 엄지손가락은 # 키패드 위치에서 시작!
엄지손가락 사용 규칙
- 엄지손가락은 상/하/좌/우 4가지 방향으로만 이동할 수 있으며, 이동 한 칸은 거리 1에 해당.
- 왼쪽 열의 3개의 숫자 1, 4, 7을 입력할 때에는 왼손 엄지손가락을 사용
- 오른쪽 열의 3개의 3,6,9를 ㅇ비력할 때에는 오른손 엄지손가락을 사용
- 가운데 열의 4개의 숫자 2, 5, 8, 0을 입력할 때에는 두 손 중에서 엄지손가락의 현재 키패드의 위치에서 더 가까운 엄지손가락을 사용을 함.
- 만약에 두 엄지손가락의 거리가 같다면, 오른손잡이는 오른손 엄지손가락을, 왼손잡이는 왼손 엄지손가락을 사용함.
[제한사항]
- numbers 배열의 크기는 1이상 1000이하
- numbers 배열 원소의 값은 0이상 9이하인 정수
- hand는 "left" or "right"임 (left : 왼손잡이, right : 오른손잡이)
- 왼손 엄지손가락을 사용한 경우 : L 문자열 사용
- 오른손 엄지손가락을 사용한 경우 : R 문자열 사용
프로그래머스
코드 중심의 개발자 채용. 스택 기반의 포지션 매칭. 프로그래머스의 개발자 맞춤형 프로필을 등록하고, 나와 기술 궁합이 잘 맞는 기업들을 매칭 받으세요.
programmers.co.kr
✅ 풀이
def solution(numbers, hand):
answer = ''
array = [[1,2,3],[4,5,6],[7,8,9],['*',0,'#']]
num = 1
l = [1, 4, 7]
r = [3, 6, 9]
lf = [3,0]
rf = [3,2]
point = [0,0]
for items in numbers:
if items in l:
answer += 'L'
lf = [l.index(items), 0]
elif items in r:
answer += 'R'
rf = [r.index(items), 2]
else:
point = [[i, j] for i in range(4) for j in range(3) if array[i][j] == items][0]
ld = abs(point[0]-lf[0]) + abs(point[1]-lf[1])
rd = abs(point[0]-rf[0]) + abs(point[1]-rf[1])
if ld > rd:
answer += 'R'
rf = point
elif rd > ld:
answer += 'L'
lf = point
else:
if hand == 'right':
answer += 'R'
rf = point
else:
answer += 'L'
lf = point
print(lf, rf)
return answer
💡 자나깨나 인덱스 조심.. 인덱스 바꿔써서 왜 안되나 하고 엄청 머리가 아팠다..
왼손가락의 위치를 lf, 오른손가락의 위치를 rf, 그리고 눌러야 할 가운데 라인 번호의 위치를 point로 초기화 하였다.
[1,4,7], [3,6,9]를 누르는 경우는 간단하니까 생략하고, [2,5,8]을 누르는 경우가 문제였는데,
이 부분은 아래 코드를 사용해서 해결했다.
"[[i, j] for i in range(4) for j in range(3) if array[i][j] == items][0]"
[2,5,8]이 위치하고 있는 인덱스를 리스트 형태인 [i,j]로 반환해주는 코드다.
반환받은 인덱스와 현재 왼손, 오른손의 위치간 거리를 계산해서 이후 작업을 구현했다.
왜 자꾸 인덱스 에러가 나나 했더만.. 행과 열의 인덱스를 바꿔쓰는 만행을 저질러버렸다..😂😂😂
그래도 해결해서 기분은 좋다!