문제 해결
1. 키패드 모양대로 2차원 배열과 현재 왼손의 위치, 오른손의 위치, 누른 손을 누적할 변수를 생성
2. 1,4,7은 왼손, 3,6,9는 오른손을 사용하여 누르고, 그 위치로 이동한다.
3. 2,5,8,0의 경우 누를 번호에서 현재 양손의 위치까지의 거리를 구해서 거리가 짧은 쪽을, 거리가 같을 경우 어느손잡이인지에 따라 그 손으로 누르고 이동한다.
(1) 눌러야할 번호의 위치를 구하고 BFS 탐색을 한다.
(2) 현재 손까지의 거리를 구한다.
(3) 양손까지의 거리를 비교한다.
😂 난이도는 카카오 코테 Lv1. 다른 분의 풀이를 보면 1차원 배열에서 숫자는 인덱스로, 위치는 튜플 형태로 값으로 넣어서 푼다. ex) 2차원 배열 상에서0번의 위치는 3,1이고 , 1번의 위치는 0,0이다. 그러므로 배열은 [(3,1), (0,0), (0,1), ... ]
소스 코드
from _collections import deque
def solution(numbers, hand):
answer = ''
keypad = [
[1, 2, 3],
[4, 5, 6],
[7, 8, 9],
['*', 0, '#']
]
left = '*' # 왼손의 위치
right = '#' # 오른손의 위치
click = '' # 누른 손을 누적
for number in numbers:
# 왼손 사용
if number in [1, 4, 7]:
left = number
click += 'L'
# 오른손 사용
elif number in [3, 6, 9]:
right = number
click += 'R'
# 양손 사용 | 눌러야 할 위치에서 BFS 탐색을 한다.
else:
dx, dy = [-1, 1, 0, 0], [0, 0, -1, 1]
for i in range(len(keypad)):
for j in range(len(keypad[0])):
if keypad[i][j] == number: # 눌러야할 번호의 위치를 찾고
q = deque()
q.append((i, j))
visit = [[-1]*len(keypad[0]) for _ in range(len(keypad))] # 새로운 배열을 만들어 BFS 탐색
visit[i][j], left_cnt, right_cnt = 0, 0, 0 # 처음 위치 0, 왼손, 오른손 이동해야 할 거리
while q:
x, y = q.popleft()
for k in range(len(dx)):
nx = x + dx[k]
ny = y + dy[k]
if 0 <= nx < len(keypad) and 0 <= ny < len(keypad[0]):
# 먼저 방문하지 않은 곳일 경우, 방문 위치 = 이전 위치 + 1
if visit[nx][ny] == -1:
visit[nx][ny] = visit[x][y] + 1
q.append((nx, ny))
# 왼손을 만날 경우
if keypad[nx][ny] == left:
left_cnt = visit[nx][ny]
# 오른손을 만날 경우
elif keypad[nx][ny] == right:
right_cnt = visit[nx][ny]
# 왼손까지의 거리가 가까운 경우
if left_cnt < right_cnt:
left = number
click += 'L'
# 오른손까지의 거리가 가까운 경우
elif right_cnt < left_cnt:
right = number
click += 'R'
# 양손 모두 거리가 같은 경우, 왼손잡이인지 오른손잡이인지에 따라 결정한다.
else:
if hand == 'left':
left = number
click += 'L'
else:
right = number
click += 'R'
answer = click
return answer
print(solution([1, 3, 4, 5, 8, 2, 1, 4, 5, 9, 5], "right"))
print(solution([7, 0, 8, 2, 8, 3, 1, 5, 7, 6, 2], "left"))
print(solution([1, 2, 3, 4, 5, 6, 7, 8, 9, 0], "right"))
출처: 프로그래머스
문제: https://programmers.co.kr/learn/courses/30/lessons/67256?language=python3
이 전화 키패드에서 왼손과 오른손의 엄지손가락만을 이용해서 숫자만을 입력하려고 합니다.
순서대로 누를 번호가 담긴 배열 numbers, 왼손잡이인지 오른손잡이인 지를 나타내는 문자열 hand가 매개변수로 주어질 때, 각 번호를 누른 엄지손가락이 왼손인 지 오른손인 지를 나타내는 연속된 문자열 형태로 return 하도록 solution 함수를 완성해주세요. [제한사항]
입출력 예입출력 예에 대한 설명 입출력 예 #1 순서대로 눌러야 할 번호가 [1, 3, 4, 5, 8, 2, 1, 4, 5, 9, 5]이고, 오른손잡이입니다. 따라서 "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"이 됩니다. |
'Algorithm Problem > Python' 카테고리의 다른 글
[python] SWEA - 3752. 가능한 시험 점수 (2) | 2020.07.29 |
---|---|
[python] 프로그래머스 - 동굴 탐험 (2020 카카오 인턴십) (2) | 2020.07.27 |
[python] 프로그래머스 - 수식 최대화 / 보석 쇼핑 (2020 카카오 인턴십) (0) | 2020.07.17 |
[python] SWEA - 1289. 원재의 메모리 복구하기 (2) | 2020.07.16 |
[python] SWEA - 1961. 숫자 배열 회전/ 1970. 쉬운 거스름돈/ 10059. 유효기간 (0) | 2020.07.14 |