일 | 월 | 화 | 수 | 목 | 금 | 토 |
---|---|---|---|---|---|---|
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 | 31 |
- 비디오 스트리밍
- beautifulsoup
- 네이버 부캠
- c++
- 파이썬
- 멘션 추천 기능
- 자바스크립트 객체
- Next.js
- 브라우저 동작
- Image 컴포넌트
- 자바스크립트
- React.js
- 네이버 부스트캠프
- 부스트캠프
- React ssr
- git checkout
- 웹크롤링
- 씨쁠쁠
- Server Side Rendering
- 파이썬 코딩테스트
- 스택
- Next/Image 캐싱
- 프로그래머스
- react
- 코딩테스트
- 네이버 부스트캠프 멤버십
- 자바 프로젝트
- PubSub 패턴
- 자바스크립트 컴파일
- 파이썬 웹크롤링
- Today
- Total
코린이의 개발 일지
[파이썬 코딩테스트] 키패드 누르기 - 2020 카카오 인턴십 본문
안녕하세요 폴라민입니다.
이번에는 2020 카카오 인턴십 코테 문제를 가지고 와 봤습니다.
이번 포스팅에는 문제에 대한 해답이 나와있으므로 아직 문제를 풀어보지 않으신 분들은 프로그래머스 혹은 백준 사이트에서 문제를 풀어보고 오시는 것을 권장드립니다.
https://programmers.co.kr/learn/challenges
그럼 시작해 볼까요?
이번 문제도 차근차근 접근하기만 했다면 크게 어렵지는 않았습니다.
우선 제 코드를 한번 볼까요?
def solution(numbers, hand):
phone_num=[[1,4,7,'*'],[2,5,8,0],[3,6,9,'#']]
left_thumb=[0,3]
right_thumb=[2,3]
answer = ''
for num in numbers:
if num in phone_num[0]:
answer+="L"
left_thumb=[0,num//3]
elif num in phone_num[2]:
right_thumb=[2,num//3-1]
answer+="R"
else:
if num==0:
num_idx=3
else:
num_idx=num//3
L_distance=(1-left_thumb[0])+abs(left_thumb[1]-num_idx)
R_distance=(right_thumb[0]-1)+abs(right_thumb[1]-num_idx)
if L_distance > R_distance:
answer+="R"
right_thumb=[1,num_idx]
elif L_distance < R_distance:
answer+="L"
left_thumb=[1,num_idx]
else:
if hand == "left":
answer+="L"
left_thumb=[1,num_idx]
else:
answer+="R"
right_thumb=[1,num_idx]
return answer
저는 먼저 숫자 패드를 2차원 배열로 표현해 주었습니다.
[[1,2,3],[4,5,6]....
이런식으로 만들까 하다가 위와 같이 표현하는게 다루기 편할 거 같아
phone_num=[[1,4,7,'*'],[2,5,8,0],[3,6,9,'#']]
이런식으로 표현을 해주었습니다.
그리고 왼손 엄지, 오른손 엄지의 위치를 나타내주는 배열을 각각 변수에 저장해두었습니다.
이제 우리는 위치에 따라 엄지의 위치를 바꿔 주고 answer에 'L' 혹은 'R'을 집어 넣어주기만 하면 됩니다.
사실 숫자가 1,4,7 이거나 3,6,9 일때는 쉽죠. 각각 왼손, 오른손 을 움직여 주면 되니까요.
문제는 가운데에 있는 숫자 2,5,8,0입니다.
이것도 차근차근 생각하면 어렵지 않습니다.
우선 1. 입력할 숫자의 위치와 왼손 엄지, 오른손 엄지 사이 거리를 비교해줍니다.
2. 거리가 다를 경우 더 가까이 있는 엄지를 움직여 줍니다.
3. 거리가 같을 경우 hand매개변수를 고려해 줍니다.
이렇게만 해주면 되죠.
L_distance=(1-left_thumb[0])+abs(left_thumb[1]-num_idx)
R_distance=(right_thumb[0]-1)+abs(right_thumb[1]-num_idx)
우선 위와 같이 숫자의 위치에서 왼손 엄지까지 거리, 오른손 엄지까지 거리를 계산해 줍니다.
거리를 비교하여 왼손이 더 가까울 경우 왼손 엄지를 움직여 주고, 오른손이 더 가까우면 오른손 엄지를 움직여 줍니다.
그리고 만약 거리가 같을 경우 hand의 값이 "left"일 경우와 "right"일 경우를 구분하여 엄지를 움직여 주면 됩니다.
이렇게 차근차근 해보니 막상 그렇게 어렵지는 않죠?
저는 이차원 배열로 키패드를 표현 했지만 다른 분들 풀이를 보니
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)}
이런식으로 딕셔너리로 표현하신 분들도 있더군요. 확실히 key와 value로 구분하여 다룰 수 있는 자료형이니 더 깔끔해보입니다. 다른 분들의 풀이도 참고하시면 더 깔끔하게 코드를 짜는 연습이 될 것 같아요.
그럼 이상으로 키패드 누르크 코테 문제 풀이를 마치도록 하겠습니다.
모두들 즐코~!!
'파이썬 코딩테스트 연습' 카테고리의 다른 글
[코딩테스트] - 2018 카카오 블라인드 : 뉴스 클러스터링 (0) | 2022.07.01 |
---|---|
[파이썬 코딩테스트] 스택, 이중 배열 간단하게 연습하기 좋은 코딩 문제 (0) | 2022.01.21 |
[파이썬 코테 문제] 로또의 최고 순위와 최저 순위 - 2021 (0) | 2022.01.09 |
[파이썬 코딩테스트] 신규 아이디 추천 (2021 Kakao blind recruitment) (0) | 2022.01.08 |