Notice
Recent Posts
Recent Comments
Tags
- 백준 선수과목 python
- 백준
- 장고 기초
- 백준 dp
- 프로그래머스
- 알고리즘 공부
- 백준 선수과목
- 알고리즘 문제
- dp 알고리즘
- 백준 14567 python
- Django
- 코딩테스트
- 스프링 초보
- spring 기초
- 위상정렬 파이썬
- 프로그래머스 level1
- programmers
- Spring 초보
- 백준 14567
- 장고
- Django 기초
- 스프링 기초
- 코딩테스트 연습
- 프로그래머스 레벨1
- 코테 연습
- 백준 선수과목 14567
- 코테
- 백준 다이나믹프로그래밍
- 백준 선수과목 파이썬
- 백준 14567 파이썬
Archives
- Today
- Total
일일구름 IT
프로그래머스 lv.1 [키패드 누르기] 2020 카카오 인턴십 본문
문제 설명
스마트폰 전화 키패드의 각 칸에 다음과 같이 숫자들이 적혀 있습니다.
이 전화 키패드에서 왼손과 오른손의 엄지손가락만을 이용해서 숫자만을 입력하려고 합니다.맨 처음 왼손 엄지손가락은 * 키패드에 오른손 엄지손가락은 # 키패드 위치에서 시작하며, 엄지손가락을 사용하는 규칙은 다음과 같습니다.
- 엄지손가락은 상하좌우 4가지 방향으로만 이동할 수 있으며 키패드 이동 한 칸은 거리로 1에 해당합니다.
- 왼쪽 열의 3개의 숫자 1, 4, 7을 입력할 때는 왼손 엄지손가락을 사용합니다.
- 오른쪽 열의 3개의 숫자 3, 6, 9를 입력할 때는 오른손 엄지손가락을 사용합니다.
- 가운데 열의 4개의 숫자 2, 5, 8, 0을 입력할 때는 두 엄지손가락의 현재 키패드의 위치에서 더 가까운 엄지손가락을 사용합니다.4-1. 만약 두 엄지손가락의 거리가 같다면, 오른손잡이는 오른손 엄지손가락, 왼손잡이는 왼손 엄지손가락을 사용합니다.
내 문제 풀이:
import numbers
def solution(numbers, hand):
answer = ''
hand = hand[0:1].upper()
num_dic = {
1: (0, 3),
2: (1, 3),
3: (2, 3),
4: (0, 2),
5: (1, 2),
6: (2, 2),
7: (0, 1),
8: (1, 1),
9: (2, 1),
'*': (0, 0),
0: (1, 0),
'#': (2, 0),
}
l_num = [1, 4, 7]
r_num = [3, 6, 9]
c_num = [2, 5, 8, 0]
l_state = '*'
r_state = '#'
for i in numbers:
if i in l_num:
l_state = i
answer = answer + 'L'
elif i in r_num:
r_state = i
answer = answer + 'R'
else:
l_len = abs(num_dic[l_state][0] - num_dic[i][0]) + abs(num_dic[l_state][1] - num_dic[i][1])
r_len = abs(num_dic[r_state][0] - num_dic[i][0]) + abs(num_dic[r_state][1] - num_dic[i][1])
if l_len < r_len:
l_state = i
answer = answer + 'L'
elif l_len > r_len:
r_state = i
answer = answer + 'R'
else:
if hand == 'L' : l_state = i
else : r_state = i
answer = answer + hand
return answer
- hand[0:1].upper()을 이용해 입력 값을 R 또는 L로 바꾸어줌
- num_dic에서 key를 키패드, value를 좌표로 설정
- *를 (0,0)으로 키패드를 좌표 설정해줌
- r_state, l_state에 현재 손가락의 위치를 저장해줌
- 눌러야 할 숫자가 2, 5, 8, 0일 때만 좌표를 이용해 왼손과 오른손 중 어떤 손이 더 가까운지 계산
처음에 문제를 잘못읽어 대각선 이동이 가능한줄 알고 숫자의 차이에 따른 거리 순위를 구해 배열을 만들어 문제를 풀었었다.
0은 11로, *와 #은 10, 12로 바꾸었다.
0순위. 0
1순위. 1, 3
2순위. 2, 4
3순위. 6
4순위. 5, 7
5순위. 9
6순위. 10, 8
[0, 1, 2, 1, 2, 4, 3, 4, 6, 5, 6] -> 인덱스 : 숫자 차, 요소 : 거리 순위
다음부터는 문제를 더 잘 읽고 풀기로 ..!
코딩 테스트중에 문제를 잘못읽어 처음부터 다시 푼다고 생각하면 소름이 돋는다..
'프로그래머스 > 프로그래머스 lv.1' 카테고리의 다른 글
프로그래머스 lv.1 [없는 숫자 더하기] 월간 코드 챌린지 시즌3 (0) | 2022.07.06 |
---|---|
프로그래머스 lv.1 [크레인 인형 뽑기] 2019 카카오 개발자 겨울 인턴십 게임 (0) | 2022.07.06 |
프로그래머스 lv.1 [숫자 문자열과 영단어] 2021 카카오 채용연계형 인턴십 (0) | 2022.07.06 |
프로그래머스 lv.1 [신규 아이디 추천] 2021 KAKAO BLIND RECRUITMENT (0) | 2022.07.05 |
프로그래머스 lv.1 [로또의 최고 순위와 최저 순위] 2021 Dev-Matching: 웹 백엔드 개발자 (0) | 2022.07.05 |