연습장

17. 키패드 누르기 본문

프로그래머스/1단계

17. 키패드 누르기

js0616 2024. 1. 19. 11:38

[1,4,7]  - 왼손

[3,6,9]  - 오른손

[2,5,8,0]  - 가까운쪽 손 거리가 같으면 hand 인 손

 

상하좌우로 거리 1 , 대각 2 


1번 - 1.4,7 의 경우 - 왼손 고정

2번 - 3,6,9 의 경우 - 오른손 고정

 

def solution(numbers, hand):
    answer = ''
    
    for i in numbers:
        if i in [1,4,7]: # 1번
            answer += "L"
        elif i in [3,6,9]: # 2번
            answer +="R"
        else :
            answer +="?"
            
    return answer

 

 


3번 - 2, 5, 8, 0 

-> 현재 키패드 에서 가까운 손 

-> 현재 L과 R 의 위치를 알아야되며 - 목표 위치까지의 거리를 비교 - 작은쪽 또는 거리가 같으면 hand 인 손 사용 

 

위치를 어떻게 표시할까 ? 

 

숫자판을 2중 배열로 정의하고 

pmap = [[1,2,3],[4,5,6],[7,8,9],['*',0,'#']]

 

각 숫자의 위치를 x,y 좌표로 정의할 수 있다. 

 

2 의 경우 pmap[0][1] => (0,1)

* 의 경우 pmap[3][0] => (3,0)  ... 

 

위의 테스트 예시의 4번째 ? 인 

 

5의 경우 

L = 4 , R = 3 , target = 5 이므로 

L = 4 -> pmap[1][0] => (1,0)

R = 3 -> pmap[0][2] => (0,2)

target   = 5 -> pmap[1][1] => (1,1)

 

이며 문제에서 두점 사이의 거리는 대각선 거리는 제외한다. 

 

L-target 의 거리는 1이며

R-target 의 거리는 2가 되며 

L 이 더 가깝게된다.

 

L 의 좌표를 xl,yl

R 의 좌표를 xr,yr

target 의 좌표를 xi,yi 라 할때 다음과 같이 구할 수 있다.

 


def solution(numbers, hand):
    answer = ''
    left = "*"
    right = "#"
    pmap = [[1,2,3],[4,5,6],[7,8,9],["*",0,"#"]]
    
    for i in numbers:
        # number 가 왼쪽
        if i in [1,4,7]:
            answer += "L"
            left = i
        # number 가 오른쪽
        elif i in [3,6,9]:
            answer +="R"
            right = i
        
        # number가 가운데일 경우
        else :
            
            # 좌표 값
            xl,yl,xr,yr,xi,yi = 0,0,0,0,0,0
            for x in range(4):
                for y in range(3):
                    if left == pmap[x][y]:
                        xl,yl = x,y
                        
                    if right == pmap[x][y]:
                        xr,yr = x,y
                        
                    if i == pmap[x][y]:
                        xi,yi = x,y
            
            # 비교 
            if abs(xi-xl)+abs(yi-yl) < abs(xi-xr)+abs(yi-yr):
                answer += "L"
                left = i
            elif abs(xi-xl)+abs(yi-yl) > abs(xi-xr)+abs(yi-yr):
                answer += "R"
                right = i
            else :
                if hand == "left":
                    answer += "L"
                    left = i
                else :
                    answer += "R"
                    right = i
                    
            
    return answer

 

'프로그래머스 > 1단계' 카테고리의 다른 글

19. 신규 아이디 추천  (0) 2024.01.19
18. 햄버거 만들기  (0) 2024.01.19
16. 크레인 인형뽑기 게임  (0) 2024.01.17
15. 이웃한 칸  (0) 2024.01.17
14. 둘만의 암호  (0) 2024.01.17