일 | 월 | 화 | 수 | 목 | 금 | 토 |
---|---|---|---|---|---|---|
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 |
- 카카오코테
- 도커연결오류
- 부스트캠프AITech
- 라이브러리란?
- 프로그래머스 레벨3
- 카카오 코딩테스트
- 프레임워크란?
- 카카오코딩테스트
- 카카오 파이썬
- 양과늑대
- 파이썬 프로그래머스
- 프로그래머스 양과늑대
- 부스트캠프 회고
- 프로그래머스LEVEL1
- 파이썬 양과늑대
- 파이썬 재귀함수
- 부스트캠프
- docker시작하기
- 도커오류
- 코딩테스트
- 부캠
- 네이버 부스트캠프
- 프로그래머스
- 프로그래머스 파이썬
- 프로그래머스 레벨2
- 프로그래머스 레벨1
- level1
- Cannot connect to the Docker daemon at unix
- 파이썬 카카오코딩테스트
- 파이썬
- Today
- Total
코린이의 공부일기
[Python]프로그래머스 LEVEL1>2020 카카오인턴쉽-키패드 누르기 본문
안녕하세요ㅎㅎ 오늘은 카카오 인턴쉽 코테문제 키패드 누르기 가져왔습니다!ㅎㅎ
카카오 코딩테스트문제는 확실히 정말 좋은 거 같다 .. 쉬운문제여도 머리를 조금은 써야하는..?ㅎㅎ
이 문제 처음 보고 소스를 금방 완성했는데 전체 테스트케이스에서 8개정도 실패가나와 거기서부터 오래걸렸다ㅠㅠㅠㅠㅠ
분명 내가 보기엔 틀린 부분이 없다고 생각했는데..! 하나하나 보니.. 내가 간과하고 있던부분이 있었다 ㅎㅎㅎ
그 부분은 밑에서 설명하겠습니다!!
문제설명
스마트폰 전화 키패드의 각 칸에 다음과 같이 숫자들이 적혀 있습니다.
이 전화 키패드에서 왼손과 오른손의 엄지손가락만을 이용해서 숫자만을 입력하려고 합니다.
맨 처음 왼손 엄지손가락은 * 키패드에 오른손 엄지손가락은 # 키패드 위치에서 시작하며, 엄지손가락을 사용하는 규칙은 다음과 같습니다.
- 엄지손가락은 상하좌우 4가지 방향으로만 이동할 수 있으며 키패드 이동 한 칸은 거리로 1에 해당합니다.
- 왼쪽 열의 3개의 숫자 1, 4, 7을 입력할 때는 왼손 엄지손가락을 사용합니다.
- 오른쪽 열의 3개의 숫자 3, 6, 9를 입력할 때는 오른손 엄지손가락을 사용합니다.
- 가운데 열의 4개의 숫자 2, 5, 8, 0을 입력할 때는 두 엄지손가락의 현재 키패드의 위치에서 더 가까운 엄지손가락을 사용합니다.
4-1. 만약 두 엄지손가락의 거리가 같다면, 오른손잡이는 오른손 엄지손가락, 왼손잡이는 왼손 엄지손가락을 사용합니다.
순서대로 누를 번호가 담긴 배열 numbers, 왼손잡이인지 오른손잡이인 지를 나타내는 문자열 hand가 매개변수로 주어질 때, 각 번호를 누른 엄지손가락이 왼손인 지 오른손인 지를 나타내는 연속된 문자열 형태로 return 하도록 solution 함수를 완성해주세요.
[제한사항]
- numbers 배열의 크기는 1 이상 1,000 이하입니다.
- numbers 배열 원소의 값은 0 이상 9 이하인 정수입니다.
- hand는 "left" 또는 "right" 입니다.
- "left"는 왼손잡이, "right"는 오른손잡이를 의미합니다.
- 왼손 엄지손가락을 사용한 경우는 L, 오른손 엄지손가락을 사용한 경우는 R을 순서대로 이어붙여 문자열 형태로 return 해주세요.
입출력 예
numbers | hand | result |
[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" |
입출력 예에 대한 설명
입출력 예 #1
순서대로 눌러야 할 번호가 [1, 3, 4, 5, 8, 2, 1, 4, 5, 9, 5]이고, 오른손잡이입니다.
따라서 "LRLLLRLLRRL"를 return 합니다.
입출력 예 #2
왼손잡이가 [7, 0, 8, 2, 8, 3, 1, 5, 7, 6, 2]를 순서대로 누르면 사용한 손은 "LRLLRRLLLRR"이 됩니다.
입출력 예 #3
오른손잡이가 [1, 2, 3, 4, 5, 6, 7, 8, 9, 0]를 순서대로 누르면 사용한 손은 "LLRLLRLLRL"이 됩니다.
문제 풀이
처음 키패드의 거리를 따져 번호를 눌러야하는 제한사항을보고 좌표를 생각해냈다.
원점을 기준으로 0~9까지 좌표로 변환하여 data값으로 두었다.
그치만 테스트케이스에서 반정도가 실패가 나오고 대체 뭐가 틀렸을까 보니 여기서 거리를 나는 좌표거리공식으로
나뒀는데... 그게 가장 큰 문제점이였다..ㅠㅠ
왜냐하면 예를들어 눌러야할 번호는 5이고 현재 왼손과 오른손이 각각 0,9를 누르고 있는 상태라면, 거리를 따져 5를 누를 손을 선택해야하는데 거리를 따져보면 5와0 사이의 거리=2 가 나오고 5와9 사이의 거리는 (2)^(1/2) 즉 루트2가 나온다 그치만 문제에서 원하는 조건으로 거리를 따진다면 둘이 같은거리가 나와야한다. 그래서 좌표거리공식으로 하면 안되며 각 각의 좌표 x값, y값을 빼서 더한 절대값으로 비교해야한다는 것을 알아차리는데 좀 걸렸다는..ㅋㅋㅋㅋㅋㅋ
★여기서 가장 먼저 캐치해야할 점!★
키패드를 어떻게 표현할 것인지
문제에서 거리를 어떻게 따지는지
요 두개만 얼른 캐치했다면 금방 풀 수 있는 문제였습니당..!
여러분도 한번 문제풀어보시고 비교해보세요!ㅎㅎㅎㅎ
def solution(numbers, hand):
data=[[1,0],[0,3],[1,3],[2,3],[0,2],[1,2],[2,2],[0,1],[1,1],[2,1]]
#키패드->좌표변환 왼쪽부터 [0,1,2,3,4,5,6,7,8,9] 표현
result=''
a=[[0,0]]
b=[[2,0]]
for i in numbers:
if i==1 or i==4 or i==7:
result+='L'
a.append(data[i]) #왼손
elif i==3 or i==6 or i==9:
result+='R'
b.append(data[i]) #오른손
elif i==2 or i==5 or i==8 or i==0:
a_distance=abs(data[i][0]-a[-1][0])+abs(data[i][1]-a[-1][1]) #왼손과의 거리
b_distance=abs(data[i][0]-b[-1][0])+abs(data[i][1]-b[-1][1]) #오른손과의 거리
if a_distance<b_distance:
result+='L'
a.append(data[i])
elif a_distance>b_distance:
result+='R'
b.append(data[i])
else:
if hand=="right":
result+='R'
b.append(data[i])
elif hand=='left':
result+='L'
a.append(data[i])
return result
포스팅은 여기까지입니다~
감사합니당
잘못된 부분 지적은 환영입니다 ♡
'STUDY > [Python] Coding Test' 카테고리의 다른 글
[Python]프로그래머스 LEVEL1> 카카오 블라인드 테스트-실패율 (0) | 2021.02.15 |
---|---|
[Python]프로그래머스 LEVEL1> 자연수 뒤집어 배열로 만들기+재귀함수 풀이 (0) | 2021.02.03 |
[Python] 프로그래머스 LEVEL1> 자릿수 더하기 + 재귀함수 풀이 (1) | 2021.02.01 |
[Python]프로그래머스 LEVEL1> 이상한 문자 만들기 (1) | 2021.02.01 |
[Python]프로그래머스 LEVEL1> 시저암호 (1) | 2021.01.29 |