Algorithm

[프로그래머스 lv1] 키패드 누르기

09009 2023. 10. 10. 13:58

문제 보기

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

 

프로그래머스

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

programmers.co.kr

 

문제 해결

완전 멍청하게 풀었는데 정답이긴 했다...

- 직접 해결한 풀이

import math
def solution(numbers, hand):
    answer = ''
    
    dic = {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)}
    
    left_num = [1,4,7]
    right_num = [3,6,9]
    
    lh, rh = dic['*'], dic['#']
    
    for number in numbers:
        if number in left_num:
            answer += 'L'
            lh = dic[number]
        elif number in right_num:
            answer += 'R'
            rh = dic[number]
        else:
            nx, ny = dic[number][0], dic[number][1]
            if abs(nx - lh[0]) + abs(ny - lh[1]) < abs(nx - rh[0]) + abs(ny - rh[1]):
                answer += 'L'
                lh = dic[number]
            elif abs(nx - lh[0]) + abs(ny - lh[1]) > abs(nx - rh[0]) + abs(ny - rh[1]):
                answer += 'R'
                rh = dic[number]    
            else:
                if hand == "right":
                    answer += 'R'
                    rh = dic[number]
                elif hand == "left":
                    answer += 'L'
                    lh = dic[number]

    return answer

 

 

정답 소스 코드 (다른 사람 풀이)

def cal_dist(num, now_l, now_r, pos, handed):
    x, y = 0, 1
    dist_l = abs(pos[now_l][x] - pos[num][x]) + abs(pos[now_l][y] - pos[num][y])
    dist_r = abs(pos[now_r][x] - pos[num][x]) + abs(pos[now_r][y] - pos[num][y])
    # 거리가 같으면
    if dist_l == dist_r:
        return 'R' if handed == 'right' else 'L'
    return 'R' if dist_l > dist_r else 'L'

def solution(numbers, hand):
    answer = ''
    location = {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)}
    
    left, right = [1,4,7], [3,6,9]
    handed = hand

    # 손 위치
    now_l, now_r = '*', '#'
    
    for num in numbers:
        if num in left:
            answer += 'L'
            now_l = num
        elif num in right:
            answer += 'R'
            now_r = num
        else:
            answer += cal_dist(num, now_l, now_r, location, handed)
            if answer[-1] == 'L':
                now_l = num
            else :
                now_r = num     
        
    return answer

코드 출처: https://velog.io/@tjdud0123/%ED%82%A4%ED%8C%A8%EB%93%9C-%EB%88%84%EB%A5%B4%EA%B8%B0-2020-%EC%B9%B4%EC%B9%B4%EC%98%A4-%EC%9D%B8%ED%84%B4%EC%8B%AD-%EB%AC%B8%EC%A0%9C