일 | 월 | 화 | 수 | 목 | 금 | 토 |
---|---|---|---|---|---|---|
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
- 회귀
- programmers
- machine learning
- 머신 러닝
- 프로그래머스
- 재귀
- Python
- python3
- 데이터베이스
- instaloader
- 스택
- googleapiclient
- 파이썬
- SQL
- 국민대
- gan
- OS
- Regression
- kmu
- 국민대학교
- Seq2Seq
- C++
- Stack
- Heap
- 정렬
- LSTM
- GIT
- db
- PANDAS
- 운영체제
Archives
- Today
- Total
정리 노트
프로그래머스 키패드 누르기(Python) 본문
728x90
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
DFS/BFS 문제를 푼 이후 휴식을 가지기 위해 레벨 1 문제를 잡았다. 처음 문제를 보고 생각할 때는
"이거 그냥 if-else의 파티겠는데?" 생각했고, 맘에 안 들지만 그 방법만 생각이 나서 이번 코드의 길이가 좀... 길다...
다 풀고 다른 사람들은 얼마나 깔끔하게 풀었을까 하고 풀이들을 봤는데.. 대부분 나랑 비슷했다.. 하하....
이 문제에서 최소 거리를 구하는데 처음에는 바로 유클리드 거리를 구하는 방식을 사용했지만 일부 문제에서 틀렸다... 여기서 살짝 멘털이 흔들렸다. 그러다 깨달았다. 손가락은 '상, 하, 좌, 우' 로만 이동한다는 것을! 이런 상황에서는 유클리드 거리를 구하는 것보다 맨해튼 거리를 구하는 게 더 낫다. 맨해튼 거리는 유클리드 거리를 구하는 식에서 제곱을 빼고 절댓값 기호를 넣어주면 된다.
이렇게 푼 코드가 아래와 같다.
def solution(numbers, hand):
answer = ''
key_pad = [[1, 2, 3], [4, 5, 6], [7, 8, 9], [-1, 0, -1]] # *과 #는 -1로 표현
left_pos, right_pos = [3, 0], [3, 2] # [row, column]
for n in numbers:
if n % 3 == 1:
answer += 'L'
left_pos[0], left_pos[1] = n // 3, 0
elif n != 0 and n % 3 == 0:
answer += 'R'
right_pos[0], right_pos[1] = n // 3 - 1, 2
else:
r, c = -1, 1
if n == 0:
r = 3
else:
r = n // 3
left_dist = abs(r - left_pos[0]) + abs(c - left_pos[1])
right_dist = abs(r - right_pos[0]) + abs(c - right_pos[1])
if left_dist == right_dist:
moving_hand = hand.upper()[0]
answer += moving_hand
if moving_hand == 'L':
left_pos[0], left_pos[1] = r, c
else:
right_pos[0], right_pos[1] = r, c
elif left_dist < right_dist:
answer += 'L'
left_pos[0], left_pos[1] = r, c
else:
answer += 'R'
right_pos[0], right_pos[1] = r, c
return answer
프로그래머스 채점 서버에서 최대 0.60ms, 메모리 사용량은 변화 없이 일정했다.
728x90
'프로그래머스 코딩테스트 연습' 카테고리의 다른 글
프로그래머스 짝지어 제거하기(Python) (0) | 2022.06.27 |
---|---|
프로그래머스 숫자 문자열과 영단어(Python) (0) | 2022.06.25 |
프로그래머스 타겟 넘버 (0) | 2022.06.24 |
프로그래머스 신규 아이디 추천(Python) (0) | 2022.06.22 |
프로그래머스 신고 결과 받기(Python) (0) | 2022.06.22 |