[CodeTest] 프로그래머스 Lv1 - 키패드 누르기

그냥·2022년 8월 5일
0

codetest

목록 보기
4/9

1. 문제

키패드 누르기



2. 조건 정리

1) 1, 4, 7은 왼손으로 누른다.
2) 3, 6, 9는 오른손으로 누른다.
3) 2, 5, 8, 0은 왼손과 오른손 중 더 가까이 위치한 손이 누른다.
4) 만약 거리가 같다면 왼손잡이면 왼손이, 오른손잡이면 오른손이 누른다.
5) 왼손은 *에서, 오른손은 #에서 시작한다.


3. 풀이


#1
def position(num, left, right, hand):
	#2
    pos = {
        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)
    }
    #3
    dist_left = abs(pos[num][0] - pos[left][0]) + \
    abs(pos[num][1] - pos[left][1])
    dist_right = abs(pos[num][0] - pos[right][0]) + \
    abs(pos[num][1] - pos[right][1])
    
    #4
    if dist_left > dist_right:
        return 'R'
    elif dist_left < dist_right:
        return 'L'
    else:
        if hand == 'right':
            return 'R'
        else:
            return 'L'
        
def solution(numbers, hand):
    answer = ''
    #5
    left = '*'
    right = '#'
    
    #6
    for number in numbers:
        if number in [3,6,9]:
            answer += 'R'
            right = number
        elif number in [1,4,7]:
            answer += 'L'
            left = number
        else:
            answer += position(number, left, right, hand)
            if position(number, left, right, hand) == 'R':
                right = number
            else:
                left = number

    return answer
  • 문제를 풀기 위해서 가장 중요한 것은 왼손과 오른손의 위치와 현재 번호의 거리를 계산할 수 있어야 하는 것이다.
  • 거리를 구하기 위해서는 번호에 좌표값을 주는 것이다. 좌표값을 만들기 위해서 position 함수
    를 만들었다.

#1
def position(num, left, right, hand):

- num: 현재 숫자
- left: 왼손이 위치한 숫자
- right: 오른손이 위치한 숫자

#2
    pos = {
        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)
        
- 휴대폰 번호판을 dict형태로 만듦. Key는 번호, value는 좌표값이다.

 #3
    dist_left = abs(pos[num][0] - pos[left][0]) + \
    abs(pos[num][1] - pos[left][1])
    dist_right = abs(pos[num][0] - pos[right][0]) + \
    abs(pos[num][1] - pos[right][1])
    
- dist_left: 현재 번호와 왼손의 번호의 위치의 거리
- dist_right: 현재 번호와 오른손의 번호의 위치의 거리

#4
    if dist_left > dist_right:
        return 'R'
    elif dist_left < dist_right:
        return 'L'
    else:
        if hand == 'right':
            return 'R'
        else:
            return 'L'
            
- dist_left가 dist_right보다 크면 'R'
  작으면 'L'을 반환
- dist_left와 dist_right의 값이 같다면
  hand가 'right'이면 'R', 'left''L'을 반환

#5
    left = '*'
    right = '#'

- 맨 처음 왼손 오른손의 위치

#6
    for number in numbers:
        if number in [3,6,9]:
            answer += 'R'
            right = number
        elif number in [1,4,7]:
            answer += 'L'
            left = number
        else:
            answer += position(number, left, right, hand)
            if position(number, left, right, hand) == 'R':
                right = number
            else:
                left = number
                
- for: numbers 배열에서 원소를 하나씩 뽑는다.
- if number in [3,6,9]: 만약 number가 3,6,9 중 
  하나면 answer에 'R' 추가, right를 현재 number로 변경
- elif number in [1,4,7]: 약 number가 1,4,7 중 
  하나면 answer에 'L' 추가, left를 현재 number로 변경
- else: 2,5,8,0이면 postion 함수를 통해서 값을 반환 받는다.
  만약 반환값이 'R'이면 right = number, 'L'이면 left = number



4. 리뷰

  • 맨 처음 문제를 보고 어떻게 풀어야 할 지 감을 아예 잡지 못하였다. 특히 거리를 어떻게 구해야 할 지 감을 잡지 못했다. 결국은 다른 분들의 풀이를 보고 문제를 풀었다.
  • 이후에 거리와 관련된 문제를 접했을 때 풀이처럼 좌표를 하나의 풀이 케이스로 생각할 수 있을 것 같다.

0개의 댓글