코딩테스트/프로그래머스

[프로그래머스] [Level 1] [2020 카카오 인턴십] 키패드 누르기

박소민 2022. 3. 23. 17:08
문제) 키패드 누르기
 

코딩테스트 연습 - 키패드 누르기

[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"

programmers.co.kr

 

  • 내 풀이
    • 2차원 리스트로 왼손 엄지, 오른손 엄지의 위치와 누르려는 숫자 위치간의 거리 계산
    • 키패드 숫자를 2차원 리스트에 직접 넣음
      • → 범위가 넓어지면 힘들 수 있음
      • 아래 다른 사람 풀이 참고하기
def solution(numbers, hand):
    answer = ''
    # *과 #은 -1, -2로 대체
    l,r=-1,-2
    x,y=0,0
    l_distance=0
    r_distance=0
    
    phone=[[1,2,3],[4,5,6],[7,8,9],[-1,0,-2]]
    
    for num in numbers:
        if num==1 or num==4 or num==7:
            answer+='L'
        elif num==3 or num==6 or num==9:
            answer+='R'
        else:
            for i in range(4):
                for j in range(3):
                    if phone[i][j]==num:
                        x,y=i,j
            for i in range(4):
                for j in range(3):
                    if phone[i][j]==l:
                        l_distance=(max(i,x)-min(i,x))+(max(j,y)-min(j,y))
                    if phone[i][j]==r:
                        r_distance=(max(i,x)-min(i,x))+(max(j,y)-min(j,y))
            #거리가 더 짧은 쪽에서 움직임
            if l_distance<r_distance:
                answer+='L'
            elif r_distance<l_distance:
                answer+='R'
            elif r_distance==l_distance:
                if hand=='left':
                    answer+='L'
                elif hand=='right':
                    answer+='R'
        #위치 저장 
        if answer[-1]=='L':
            l=num
        if answer[-1]=='R':
            r=num
            
    return answer
  • 절댓값 함수 사용해서 넣기 : abs()
...					
                    if phone[i][j]==l:
                        l_distance=abs(i-x)+abs(j-y)
                    if phone[i][j]==r:
                        r_distance=abs(i-x)+abs(j-y)           
...

 

 

  • 다른 사람 풀이
    • 거리 계산 시 절댓값 함수 abs() 사용
    • 📍키패드 숫자의 위치를 각각 계산
      • x= (number-1) // 3
      • y= (number-1) % 3
def solution(numbers, hand):
    #왼손 엄지, 오른손 엄지 위치
    L_list = [(3, 0)]
    R_list = [(3, 2)]
    answer = ''
    for number in numbers:
        if number == 0:
            x = 3
            y = 1
        else:
            x = (number-1) // 3
            y = (number-1) % 3

        if y == 0: #눌러야 하는 숫자가 1,4,7 일 경우
            answer += 'L'
        elif y == 2: #눌러야 하는 숫자가 3,6,9 일 경우
            answer += 'R'
        else:
            L_dis = abs(L_list[0][0] - x) + abs(L_list[0][1] - y)
            R_dis = abs(R_list[0][0] - x) + abs(R_list[0][1] - y)
            #거리가 짧은 쪽이 누름, 거리가 같으면 기준손잡이에 따라 결정
            if L_dis < R_dis:
                answer += 'L'
            elif R_dis < L_dis:
                answer += 'R'
            else:
                if hand == 'left':
                    answer += 'L'
                else:
                    answer += 'R'
        #위치 저장
        if answer[-1]=='L':
            L_list = [(x,y)]
        if answer[-1]=='R':
            R_list = [(x,y)]

    return answer