Notice
Recent Posts
Recent Comments
Link
«   2024/09   »
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
more
Archives
Today
Total
관리 메뉴

김찬양의 개발일지

32일차. [카카오 인턴] 키패드 누르기 본문

코딩테스트/Programmers Level 1

32일차. [카카오 인턴] 키패드 누르기

자유로운영혼이다냥 2023. 12. 26. 23:42

링크

https://school.programmers.co.kr/learn/courses/30/lessons/67256

 

프로그래머스

코드 중심의 개발자 채용. 스택 기반의 포지션 매칭. 프로그래머스의 개발자 맞춤형 프로필을 등록하고, 나와 기술 궁합이 잘 맞는 기업들을 매칭 받으세요.

programmers.co.kr

 


 

문제


 

정답

def solution(numbers, hand):
    answer = ''
    left = 10
    right = 12
    for number in numbers:
        if number == 0:
            number = 11
        if number in [1, 4, 7]:
            answer += 'L'
            left = number
        elif number in [3, 6, 9]:
            answer += 'R'
            right = number
        else:
            number_x = (number-1)%3
            number_y = (number-1)//3
            left_x = (left-1)%3
            left_y = (left-1)//3
            right_x = (right-1)%3
            right_y = (right-1)//3
            left_len = abs(number_x-left_x)+abs(number_y-left_y)
            right_len = abs(number_x-right_x)+abs(number_y-right_y)
            if left_len < right_len:
                answer += 'L'
                left = number
            elif left_len > right_len:
                answer += 'R'
                right = number
            else:
                if hand == 'right':
                    answer += 'R'
                    right = number
                else:
                    answer += 'L'
                    left = number
    return answer

 

풀이과정

 

문제를 간소화하는 전략이 필요하다. 먼저 1, 4, 7은 왼손으로 누른다.

if number in [1, 4, 7]:
    answer += 'L'
    left = number

그리고 3, 6, 9는 오른손으로 누른다.

if number in [3, 6, 9]:
    answer += 'R'
    right = number

자 그러면 중앙 2580이 문제인데, 딕셔너리를 이용해 좌표를 저장하는 방법도 잇지만, 여기서는 직접 계산하는방법을 쓰기로햇다.

먼저 0을 11, *을 10, #을 12로 가정하면, 

left = 10
right = 12

if number == 0:
    number = 11

각 숫자의 위치는 위아래 = (숫자-1)//3, 좌우 = (숫자-1)%3가 된다. 그러면, 

number_x = (number-1)%3
number_y = (number-1)//3
left_x = (left-1)%3
left_y = (left-1)//3
right_x = (right-1)%3
right_y = (right-1)//3

자 이제 그러면 거리를 구하고 비교하자. 가까운쪽으로 누른다.

left_len = abs(number_x-left_x)+abs(number_y-left_y)
right_len = abs(number_x-right_x)+abs(number_y-right_y)
if left_len < right_len:
    answer += 'L'
    left = number
elif left_len > right_len:
    answer += 'R'
    right = number

마지막으로 이마저도 거리가 같다면, 그사람의 주 사용 손에따라 갈리면 된다.

if hand == 'right':
    answer += 'R'
    right = number
else:
    answer += 'L'
    left = number

 

딕셔너리를 사용하지 않고 풀고싶어서(적기 귀찮아서) 햇지만, 딕셔너리가 더 깔끔한 코드가 될 것 같다.(+ 거리를 구하는 함수를 따로 뺴는것도 좋아보인다.)

'코딩테스트 > Programmers Level 1' 카테고리의 다른 글

34일차. 체육복  (1) 2023.12.29
33일차. K번째수  (0) 2023.12.28
31일차. 두 개 뽑아서 더하기  (0) 2023.12.25
30일차. 3진법 뒤집기  (0) 2023.12.24
29일차. 내적  (0) 2023.12.24