알고리즘_코딩테스트/프로그래머스_Level1
40. 키패드 누르기
논곰
2020. 9. 12. 23:55
0. 문제
링크) 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
1. 알고리즘 계획
- 각 키패드의 규칙을 확인 (3으로 나눴을 때 나머지가 동일하게 나타난다.)
- 그 규칙을 토대로 배열의 행과 열 위치를 설정한다.
- Left규칙과 Right규칙을 설정한다.
- 만약 Mid에 위치한 번호를 누를 경우 '왼손과 오른손 각 위치의 행과 열값'을 '눌러야 하는 번호의 행과 열 값'을 각각 계산해서 비교한다. (계산은 절대값으로 해야 한다.)
- 각각의 번호를 누르면서 answer변수에 눌렀던 손의 번호를 저장한다.
2. 나의 코드
def solution(numbers, hand):
answer = ""
LH = [3, 0]
RH = [3, 2]
for v in numbers:
if v % 3 == 1:
LH = [v//3, (v+2) % 3]
answer+="L"
elif v % 3 == 0 and v != 0:
RH = [v//3-1, (v+2) % 3]
answer+="R"
else:
if v == 0:
mid = [3, 1]
else:
mid = [v//3, (v+2) % 3]
LH_dist = abs(LH[0]-mid[0])+abs(LH[1]-mid[1])
RH_dist = abs(RH[0]-mid[0])+abs(RH[1]-mid[1])
if LH_dist == RH_dist:
if hand == "right":
RH = mid
answer+="R"
else:
LH = mid
answer+="L"
elif LH_dist < RH_dist:
LH = mid
answer+="L"
else:
RH = mid
answer+="R"
return answer
- 스스로 나쁘지 않게 작성한 코드라는 생각을 했다.
- 하지만 (어쩔 수 없는 것이겠지만) if-else구문이 너무 많아 직관적으로 보이게 만들지 못했다는 점에서 살짝 아쉽다.
3. 다른 사람의 코드
def solution(numbers, hand):
answer = ''
key_dict = {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)}
left = [1,4,7]
right = [3,6,9]
lhand = '*'
rhand = '#'
for i in numbers:
if i in left:
answer += 'L'
lhand = i
elif i in right:
answer += 'R'
rhand = i
else:
curPos = key_dict[i]
lPos = key_dict[lhand]
rPos = key_dict[rhand]
ldist = abs(curPos[0]-lPos[0]) + abs(curPos[1]-lPos[1])
rdist = abs(curPos[0]-rPos[0]) + abs(curPos[1]-rPos[1])
if ldist < rdist:
answer += 'L'
lhand = i
elif ldist > rdist:
answer += 'R'
rhand = i
else:
if hand == 'left':
answer += 'L'
lhand = i
else:
answer += 'R'
rhand = i
return answer
- dict객체를 이용한 풀이
- 나와 방식은 비슷하지만, 내가 키패드에서 규칙을 찾아내고자 했던 것과 달리 dict에 각각의 행렬값을 입력해줬다.
- 하지만 코드는 오히려 깔끔해보인다.
4. 정리 및 리뷰
- 내심 문제가 어려워지고 코드가 복잡해질 수록 'dict'자료형의 사용빈도가 올라가는 것 같다고 막연히 생각했는데, 확실히 많이 보이는 것 같다.
- dict자료형을 쉽게 사용할 수 있게 공부해야겠다.
- 이번 코드는 예전에는 어려웠다고 생각했던 문제였는데, 비교적 잘 푼 것 같아서 뿌듯하다.
코드 만족도: ★★★★★