sm 기술 블로그
키패드 누르기(2020 카카오 인턴십) - 파이썬 본문
phone = [[1,2,3], [4,5,6], [7,8,9], ["*",0,"#"]]
def findIndex(n):
for i in range(len(phone)):
for j in range(len(phone[i])):
try:
return [i, phone[i].index(n)]
break
except:
continue
def solution(numbers, hand):
left = findIndex("*")
right = findIndex("#")
current = []
result = []
answer = ''
for n in numbers:
if n == 1 or n == 4 or n == 7:
left = findIndex(n)
result.append("L")
elif n == 3 or n == 6 or n == 9:
right = findIndex(n)
result.append("R")
else:
current = findIndex(n)
rightCur = abs(right[0] - current[0]) + abs(right[1] - current[1])
leftCur = abs(left[0] - current[0]) + abs(left[1] - current[1])
if(rightCur == leftCur):
if hand == "right" :
right = current
result.append("R")
elif hand == "left":
left = current
result.append("L")
elif(rightCur - leftCur > 0):
left = current
result.append("L")
else:
right = current
result.append("R")
answer = "".join(result)
return answer
문제요약
휴대폰 키패드 중에서 왼손으로 누르면 L 오른손으로 누르면 R을 입력해라.
(1,4,7은 무조건 왼손 | 3,6,9는 무조건 오른손 | 2,5,8,0은 두 손 중 가까운 손으로 | 두 손의 거리가 같다면 오른손잡이는 오른손 왼손잡이는 왼손)
설명
다양한 방법이 있겠지만, 키패드를 2차원 배열로 그려보았다.
phone = [[1,2,3], [4,5,6], [7,8,9], ["*",0,"#"]]
다행히도 파이썬은 숫자, 문자가 혼합 가능하여 다음과 같이 표현이 가능하다.
def findIndex(n):
for i in range(len(phone)):
for j in range(len(phone[i])):
try:
return [i, phone[i].index(n)]
break
except:
continue
키배드의 인덱스 위치를 찾는 함수를 하나 만들어 주었다.
만약, index가 없는 경우 에러를 발생시키기 때문에 try catch문으로 감싸주었다.
다시말해 에러가 났다면 index가 없는 것이고 그 반복 분기는 넘기면 된다.
def solution(numbers, hand):
left = findIndex("*")
right = findIndex("#")
current = []
result = []
answer = ''
for n in numbers:
if n == 1 or n == 4 or n == 7:
left = findIndex(n)
result.append("L")
elif n == 3 or n == 6 or n == 9:
right = findIndex(n)
result.append("R")
else:
current = findIndex(n)
rightCur = abs(right[0] - current[0]) + abs(right[1] - current[1])
leftCur = abs(left[0] - current[0]) + abs(left[1] - current[1])
if(rightCur == leftCur):
if hand == "right" :
right = current
result.append("R")
elif hand == "left":
left = current
result.append("L")
elif(rightCur - leftCur > 0):
left = current
result.append("L")
else:
right = current
result.append("R")
answer = "".join(result)
return answer
왼손은 *에서 오른손은 #에서 시작해준다.
current는 가운데 번호로 2,5,8,0의 경우를 나타내준다.
각 분기별 결과는 result에 넣어 반복문이 끝나고 문자열 형태로 answer에 저장해 줄 것 이다.
1. 왼손 입력
if n == 1 or n == 4 or n == 7:
left = findIndex(n)
result.append("L")
1,4,7은 왼손이다.
left는 더 이상 *이 아니기 때문에 위치를 저장해주고 왼손으로 눌렀다는 의미로 L을 넣어준다.
2. 오른손 입력
elif n == 3 or n == 6 or n == 9:
right = findIndex(n)
result.append("R")
3,6,9는 오른손이다
right는 더 이상 #이 아니기 때문에 위치를 저장해주고 오른손으로 눌렀다는 의미로 R을 넣어준다.
3. 가운데 번호들
else:
current = findIndex(n)
rightCur = abs(right[0] - current[0]) + abs(right[1] - current[1])
leftCur = abs(left[0] - current[0]) + abs(left[1] - current[1])
if(rightCur == leftCur):
if hand == "right" :
right = current
result.append("R")
elif hand == "left":
left = current
result.append("L")
elif(rightCur - leftCur > 0):
left = current
result.append("L")
else:
right = current
result.append("R")
2,5,8,0은 조금 까다롭다.
먼저 current에 가운데 인덱스를 넣어주자.
그 후 current기준으로 right와 left의 거리를 계산한다.
다음 문제의 조건에 맞는 분기에 들어가서 원하는 행동을 취하면 된다.
answer = "".join(result)
최종으로 결과를 answer에 문자열로 저장해준다.
'문제 > 프로그래머스_파이썬' 카테고리의 다른 글
신고 결과 받기(2022 KAKAO BLIND RECRUITMENT) - 파이썬 (0) | 2022.10.08 |
---|---|
성격 유형 검사하기(2022 KAKAO TECH INTERNSHIP) - 파이썬 (1) | 2022.10.07 |
신규 아이디 추천(2021 KAKAO BLIND RECRUITMENT) - 파이썬 (0) | 2022.10.06 |
크레인 인형뽑기 게임(2019 카카오 개발자 겨울 인턴십) - 파이썬 (0) | 2022.10.04 |
숫자 문자열과 영단어 (카카오 채용연계형 인턴십) - 파이썬 (0) | 2022.10.04 |