-
코딩테스트 연습> 2020 카카오 인턴십> 키패드 누르기ALGORITHM/Programmers 2020. 9. 10. 23:43728x90
<문제링크: programmers.co.kr/learn/courses/30/lessons/67256>
문제설명: 키패드에 입력할 번호들의 배열 numbers가 주어지고
1,4,7은 왼손으로, 3,6,9는 오른손으로, 그리고 나머지 2,5,8,0은
현재 위치의 왼손과 오른손 중 가까운 거리의 손가락으로 누르면 된다.
만약 거리가 같다면, hand에 주어진 손가락으로 누르면되고,
키패드 번호를 누를때마다, 현재 누른 손가락의 위치를 갱신해주면 된다.
[1차 시도]
def solution(numbers, hand): ans = '' keypad = [[3,1],[0,0],[0,1],[0,2],[1,0],[1,1],[1,2],[2,0],[2,1],[2,2]] cur = {'left':[3,0], 'right':[3,2]} for i in numbers: if i in [1,4,7]: ans+='L' cur['left'] = keypad[i] elif i in [3,6,9]: ans+='R' cur['right'] = keypad[i] else: useleft = abs(keypad[i][0]-cur['left'][0]) + abs(keypad[i][1]-cur['left'][1]) useright = abs(keypad[i][0]-cur['right'][0]) + abs(keypad[i][1]-cur['right'][1]) if useleft > useright: ans+='R' cur['right'] = keypad[i] elif useleft < useright: ans+='L' cur['left'] = keypad[i] else: ans+=hand[0].upper() cur[hand] = keypad[i] return ans
풀이: 키패드를 2차원 배열로 생각하면 좌표를 구할 수 있는데,
해당 숫자의 좌표들을 keypad 배열에 2차원 배열의 형태로 저장해준다.
그리고 현재 위치의 *과 #또한 cur에 딕셔너리로 좌표를 저장한다.
numbers를 for문으로 돌면서,
해당 숫자가 1,4,7에 속하면 ans에 L을 추가하고, 왼손의 위치를 현재 좌표로 갱신한다.
해당 숫자가 3,6,9에 속하면 ans에 R을 추가하고, 오른손 위치를 현재 좌표로 갱신한다.
나머지 2,5,8,0에 속하면 왼손과 해당 숫자의 거리, 그리고 오른손과 해당 숫자의 거리 값을 구한 다음
작은 값의 손가락에 대해 위에서 동일한 방법으로 처리한다.
만약 같다면, hand값의 첫번째 인덱스를 대문자로 바꿔서 ans에 추가하고 cur의 hand키에 해당하는 값을
현재 숫자의 좌표로 갱신한다.
최종적으로 ans를 return하면,
채첨결과: 정확성 테스트케이스 20개 모두 잘 통과한다.
'ALGORITHM > Programmers' 카테고리의 다른 글
코딩테스트 연습> 그래프 > 순위 (0) 2021.03.09 코딩테스트 연습> 2019 카카오 개발자 겨울 인턴십> 크레인 인형뽑기 게임 (0) 2020.10.24 코딩테스트 연습> 탐욕법(Greedy)> 구명보트 (0) 2020.08.14 코딩테스트 연습> Summer/Winter Coding(~2018)> 예산 (0) 2020.07.26 코딩테스트 연습> 스택/큐> 쇠막대기 (0) 2020.07.24