https://programmers.co.kr/learn/courses/30/lessons/67256
코딩테스트 연습 - 키패드 누르기
[1, 3, 4, 5, 8, 2, 1, 4, 5, 9, 5] "right" "LRLLLRLLRRL" [7, 0, 8, 2, 8, 3, 1, 5, 7, 6, 2] "left" "LRLLRRLLLRR" [1, 2, 3, 4, 5, 6, 7, 8, 9, 0] "right" "LLRLLRLLRL"
programmers.co.kr
우선, 접근 못 했다.
겁내 어렵드만. 이런 걸 풀어야 카카오에 들어갈 수 있구나. 포기한다.
코드 해설만 해야겠다.
풀이
def solution(numbers, hand):
answer = ''
# 왼손 위치를 숫자상으로는 10, 오른손 위치를 숫자상으로 12에 둠. 즉, 0은 11의 위치.
lastL = 10
lastR = 12
# [1,4,7]누를 땐, result에 L 반환. 그리고 왼손의 마지막 위치는 [1,4,7]중에 있을거임.
# [3,6,9]누를 땐, result에 R 반환. 그리고 오른손의 마지막 위치는 [3,6,9]중에 있을거임.
# 다 아닐 땐, n이 0이면, n은 11로 해석. else면 n값 그대로 놔둠. 즉 여기선 [2,5,8]
for n in numbers:
if n in [1,4,7]:
answer+='L'
lastL = n
elif n in [3,6,9]:
answer+='R'
lastR = n
else:
n = 11 if n == 0 else n
# 다음에 누를 n과 왼손, 오른손의 마지막 위치를 뺌.
absL = abs(n-lastL)
absR = abs(n-lastR)
# 그래서 몫과 나머지를 더한 값이 더 작은 쪽이 움직여야 함.
if sum(divmod(absL, 3)) > sum(divmod(absR, 3)):
answer+='R'
lastR = n
elif sum(divmod(absL, 3)) < sum(divmod(absR, 3)):
answer +='L'
lastL = n
#만약 둘이 같다면, 왼손잡이는 L을 반환하고, 오른손잡이는 R을 반환.
else:
if hand == 'left':
answer+='L'
lastL = n
else:
answer+='R'
lastR = n
return answer
예시
numbers = [1, 3, 4, 5, 8, 2, 1, 4, 5, 9, 5]
hand = 'right'
# 여기서는 [4,5,8]에서 5랑, [4,5,9]에서 5를 예시로.
def solution(numbers, hand):
answer = ''
lastL = 10
lastR = 12
"""
① 여기까지는 result=[LRL]이 들어가있음.
② 여기까지는 result=[LRLLLRLL]
"""
for n in numbers:
if n in [1,4,7]:
answer+='L'
lastL = n
elif n in [3,6,9]:
answer+='R'
lastR = n
else:
n = 11 if n == 0 else n
absL = abs(n-lastL)
absR = abs(n-lastR)
"""
① [4,5,8]에서 다음에 5를 눌러야 할 상황
여기서 마지막 위치 왼손은 4, 오른손은 3
그리고 absL은 1, absR은 2
그리고 3으로 나눠준 몫과 나머지를 더해주면
왼손은 몫 0 나머지 1 , 오른손은 몫 0 나머지 2
여기서는 sum 비교하면 오른손이 더 크니까, 왼손이 더 가까운 것.
그래서 result에 L 반환. 왼손은 5에, 오른손은 3에 있음.
"""
"""
② [4,5,9]에서 다음에 5를 눌러야 할 상황
여기서 마지막 왼손 위치는 4, 오른손은 2에 잇음
그리고 absL은 1 absR 3
그리고 3으로 나눠준 몫과 나머지를 더해주면
왼손은 몫 0 나머지 1, 오른손은 몫 1 나머지 0
sum을 비교하면 똑같으니까 그럴 경우엔 hand를 체크함.
여기서는 hand가 right이니까 오른손 움직여야함.
result에 R 반환. 왼손은 4, 오른손은 5에 있음.
"""
if sum(divmod(absL, 3)) > sum(divmod(absR, 3)):
answer+='R'
lastR = n
elif sum(divmod(absL, 3)) < sum(divmod(absR, 3)):
answer +='L'
lastL = n
else:
if hand == 'left':
answer+='L'
lastL = n
else:
answer+='R'
lastR = n
"""
결과적으로 answer는 [LRLLLRLLRRL]이 반환됨.
"""
return answer
'[PYTHON]' 카테고리의 다른 글
[프로그래머스]LV1. 음양 더하기 (0) | 2022.04.23 |
---|---|
[프로그래머스]LV1. 없는 숫자 더하기 (0) | 2022.04.23 |
[프로그래머스]LV1. 숫자 문자열과 영단어 (0) | 2022.04.23 |
[프로그래머스]LV1. 신규 아이디 추천 (0) | 2022.04.23 |
[프로그래머스]LV1. 로또의 최고 순위와 최저 순위 (0) | 2022.04.23 |
댓글