아래의 문제는 카카오 채용 코딩테스트 내용이며 코드는 직접 푼 내용입니다.
키패드누르기
문제상황
요구사항
순서대로 누를 번호가 담긴 배열 numbers,
왼손잡이인지 오른손잡이인 지를 나타내는 문자열 hand가 매개변수로 주어질 때,
각 번호를 누른 엄지손가락이 왼손인 지 오른손인 지를 나타내는
연속된 문자열 형태로 return 하도록 solution 함수를 완성해주세요.
제한사항
- numbers 배열의 크기는 1 이상 1,000 이하입니다.
- numbers 배열 원소의 값은 0 이상 9 이하인 정수입니다.
- hand는 "left" 또는 "right" 입니다.
- "left"는 왼손잡이, "right"는 오른손잡이를 의미합니다.
- 왼손 엄지손가락을 사용한 경우는 L, 오른손 엄지손가락을 사용한 경우는 R을 순서대로 이어붙여 문자열 형태로 return 해주세요.
입출력
풀이과정
1. 입력한 숫자 : 1,4,7 => 왼손선택, 결과 : L -> 왼손위치가 현재누른 숫자로 바뀜
2. 입력한 숫자 : 3,6,9 => 오른손선택 , 결과 : R -> 오른손위치가 현재누른 숫자로 바뀜
3. 입력한 숫자 : 그외일때 거리를 구한다 => 어떻게 거리를 구할것인가?
3-1.입력한 숫자와 왼손위치의 거리 vs 입력한 숫자와 오른손위치의 거리
- 왼쪽거리가 더 짧으면 왼손선택, 결과 : L -> 왼손위치가 현재누른 숫자로 바뀜
- 오른손거리가 더 짧으면 오른손선택, 결과 : R -> 오른손위치가 현재누른 숫자로 바뀜
- 거리가 같으면, 누른손에 따라 결과 선택
- 오른손이라면, 오른손선택, 결과 : R -> 오른손위치가 현재누른 숫자로 바뀜
- 왼손이라면, 왼손선택, 결과 : L -> 왼손위치가 현재누른 숫자로 바뀜
요구사항에 따라서 IF문을 잘 나누기만 하면된다.
처리하는 작업이 반복되는게 많다.
아마 여기에서 어려웠던건 어떻게 거리를 구할것인지였다.
키패드를 좌표로 바꿔야겠다는 아이디어가 필요했다.
그리고 좌표상의 거리를 구한다. |x1-x2| + |y1-y2|
결과
내가 푼 정답코드결과
keypad={
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)
}
def distance(l,r,n):
left_x,left_y = keypad[l][0],keypad[l][1]
right_x,right_y = keypad[r][0],keypad[r][1]
n_x,n_y = keypad[n][0],keypad[n][1]
left_dist=abs(left_x-n_x)+abs(left_y-n_y)
right_dist=abs(right_x-n_x)+abs(right_y-n_y)
return left_dist,right_dist
def solution(numbers, hand):
answer = ''
left='*'
right='#'
for n in numbers:
#print(left,right,n)
if n in [1,4,7]:
answer=answer+"L"
left=n
elif n in [3,6,9]:
answer=answer+"R"
right=n
else: #거리가 더 작은쪽을 선택
#left-n vs right-n 거리비교
ld,rd=distance(left,right,n)
if ld<rd: #왼쪽거리가 더 짧으면 왼손을 선택
answer=answer+"L"
left=n
elif ld>rd: #오른쪽거리가 더 짧으면 오른손을 선택
answer=answer+"R"
right=n
elif ld==rd: #비교한 거리가 같으면 hand를 따라감
if hand=='right':
answer=answer+"R"
right=n #left는 이전꺼, right는 n
elif hand=='left':
answer=answer+"L"
left=n #left는 n, right는 이전꺼
return answer
너무 중복되는 처리가 많아서 함수로 바꿀까도 했지만, 어차피 코드길이는 거의 차이가 없더라.
배운점
- 뭔가 두 점의 거리를 구하려고 할땐, 좌표를 생각하자.
'코딩 테스트' 카테고리의 다른 글
[백준][파이썬]21921.블로그 -슬라이딩윈도우 (0) | 2021.07.29 |
---|---|
[백준][파이썬]11659.구간합구하기4 - 구간합(접두사합) (0) | 2021.07.28 |
[카카오][Python]메뉴리뉴얼 (1) | 2021.07.09 |
[카카오][Python] 숫자문자열과 영단어 (0) | 2021.07.09 |
[카카오][Python] 문자열압축 (0) | 2021.07.08 |
[백준][python]1920.수찾기 - 이진탐색 (0) | 2021.07.05 |