티스토리 뷰

반응형

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

 

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

[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

 


⊙ 문제

⊙ 제한사항

⊙ 입출력 예

⊙ 입출력 예 설명


 

⊙ 문제 접근 과정

 

문제를 본 후, 현재 손 위치를 기억해야한다고 생각이 들었습니다.

 

[1, 4, 7]는 무조건 왼손,

[3, 6, 9]는 무조건 오른손,

[2, 5, 8, 0]은 더 가까운 손이 누릅니다.

 

 

오른손과 왼손이 무조건 누르는 것만 구현하는 것까지 코드를 볼까요?

def solution(numbers, hand):
    #손 세팅
    leftHand = [1,4,7]
    rightHand = [3,6,9]
    middle = [2,5,8,0]
    
    #초기값 세팅
    answer = ''
    left = '*'
    right = '#'
    
    
    for i in numbers:
        #왼손이면
        if i in leftHand:
            answer+='L'
            left = i
            
        #오른손이면
        if i in rightHand:
            answer+='R'
            right = i
            
        #중간이면
        if i in middle:
            answer+='M'
            #손 세팅 필요
            
    return answer

 

이제 중간인 경우만 고려해주면 됩니다.

 

 

 

중간인 경우 따로 포지션 함수로 빼서 모듈화하면 좋을 것 같아요.

def pos(left, right, num, hand):
    #키패드 좌표 설정
    keypad = {
        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)
    }
    
    #거리 계산
    distLeft = abs(keypad[num][0] - keypad[left][0]) + abs(keypad[num][1] - keypad[left][1])
    distRight = abs(keypad[num][0] - keypad[right][0]) + abs(keypad[num][1] - keypad[right][1])
    
    #거리 비교
    if distLeft < distRight:
        return 'L'
    elif distLeft > distRight:
        return 'R'
    else:
        #거리가 같다면 어느 손잡이인지 판별
        if hand=='right':
            return 'R'
        else:
            return 'L'

 

그다음 최종적으로 누른 손을 세팅해줍니다.

 

#중간이면
        if i in middle:
            answer+=pos(left, right, i, hand)
            #손 위치 세팅
            if pos(left, right, i, hand) == 'L':
                left = i
            else:
                right = i

 

 

 


 

⊙ 문제 풀이

 

def pos(left, right, num, hand):
    #키패드 좌표 설정
    keypad = {
        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)
    }
    
    #거리 계산
    distLeft = abs(keypad[num][0] - keypad[left][0]) + abs(keypad[num][1] - keypad[left][1])
    distRight = abs(keypad[num][0] - keypad[right][0]) + abs(keypad[num][1] - keypad[right][1])
    
    #거리 비교
    if distLeft < distRight:
        return 'L'
    elif distLeft > distRight:
        return 'R'
    else:
        #거리가 같다면 어느 손잡이인지 판별
        if hand=='right':
            return 'R'
        else:
            return 'L'

def solution(numbers, hand):
    #손 세팅
    leftHand = [1,4,7]
    rightHand = [3,6,9]
    middle = [2,5,8,0]
    
    #초기값 세팅
    answer = ''
    left = '*'
    right = '#'
    
    
    for i in numbers:
        #왼손이면
        if i in leftHand:
            answer+='L'
            left = i
            
        #오른손이면
        if i in rightHand:
            answer+='R'
            right = i
            
        #중간이면
        if i in middle:
            answer+=pos(left, right, i, hand)
            #손 위치 세팅
            if pos(left, right, i, hand) == 'L':
                left = i
            else:
                right = i
            
    return answer

⊙ 마무리

 

코딩..

 

 

 

좋아요는 로그인하지 않아도 누를 수 있습니다!

728x90
반응형
댓글
공지사항
최근에 올라온 글
최근에 달린 댓글
Total
Today
Yesterday
링크
«   2024/05   »
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 31
글 보관함