Notice
Recent Posts
Recent Comments
Link
일 | 월 | 화 | 수 | 목 | 금 | 토 |
---|---|---|---|---|---|---|
1 | 2 | |||||
3 | 4 | 5 | 6 | 7 | 8 | 9 |
10 | 11 | 12 | 13 | 14 | 15 | 16 |
17 | 18 | 19 | 20 | 21 | 22 | 23 |
24 | 25 | 26 | 27 | 28 | 29 | 30 |
Tags
- Level2_PStage
- 백준
- python3
- 파이썬 3
- 단계별문제풀이
- 개인회고
- 이코테
- 정렬
- 기술면접
- 다이나믹프로그래밍
- 다시보기
- U_stage
- mrc
- 알고리즘스터디
- 주간회고
- ODQA
- 최단경로
- dp
- 부스트캠프_AITech_3기
- 알고리즘_스터디
- 프로그래머스
- dfs
- Level2
- 부스트캠프_AITech3기
- 그래프이론
- 이진탐색
- 구현
- 그리디
- Level1
- 백트랙킹
Archives
- Today
- Total
국문과 유목민
40. 키패드 누르기 본문
0. 문제
링크) https://programmers.co.kr/learn/courses/30/lessons/67256
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자료형을 쉽게 사용할 수 있게 공부해야겠다.
- 이번 코드는 예전에는 어려웠다고 생각했던 문제였는데, 비교적 잘 푼 것 같아서 뿌듯하다.
코드 만족도: ★★★★★
'알고리즘_코딩테스트 > 프로그래머스_Level1' 카테고리의 다른 글
39. 다트확률 구하기 (0) | 2020.09.12 |
---|---|
38. 실패율 (0) | 2020.09.12 |
37. 비밀지도 찾기 (0) | 2020.09.12 |
36. 예산 (0) | 2020.09.12 |
35. 별 찍기 (0) | 2020.09.12 |
Comments