sm 기술 블로그

키패드 누르기(2020 카카오 인턴십) - 파이썬 본문

문제/프로그래머스_파이썬

키패드 누르기(2020 카카오 인턴십) - 파이썬

sm_hope 2022. 10. 5. 09:48
phone = [[1,2,3], [4,5,6], [7,8,9], ["*",0,"#"]]

def findIndex(n):
    for i in range(len(phone)):
        for j in range(len(phone[i])):
            try:
                return [i, phone[i].index(n)]
                break
            except:
                continue
    

def solution(numbers, hand):
    left = findIndex("*")
    right = findIndex("#")
    current = []
    result = []
    answer = ''

    for n in numbers:   
        if n == 1 or n == 4 or n == 7:
            left = findIndex(n)
            result.append("L")
        
        elif n == 3 or n == 6 or n == 9:
            right = findIndex(n)
            result.append("R")
            
        else:
            current = findIndex(n)
            rightCur = abs(right[0] - current[0]) + abs(right[1] - current[1])
            leftCur = abs(left[0] - current[0]) + abs(left[1] - current[1])
            
            if(rightCur == leftCur):
                if hand == "right" :
                    right = current
                    result.append("R")
                elif hand == "left":
                    left = current
                    result.append("L")
            elif(rightCur - leftCur > 0):
                left = current
                result.append("L")
            else:
                right = current
                result.append("R")

    answer = "".join(result)          
    
    return answer

문제요약

휴대폰 키패드 중에서 왼손으로 누르면 L 오른손으로 누르면 R을 입력해라.

(1,4,7은 무조건 왼손 | 3,6,9는 무조건 오른손 | 2,5,8,0은 두 손 중 가까운 손으로 | 두 손의 거리가 같다면 오른손잡이는 오른손 왼손잡이는 왼손)

 

설명

다양한 방법이 있겠지만, 키패드를 2차원 배열로 그려보았다.

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

다행히도 파이썬은 숫자, 문자가 혼합 가능하여 다음과 같이 표현이 가능하다.

def findIndex(n):
    for i in range(len(phone)):
        for j in range(len(phone[i])):
            try:
                return [i, phone[i].index(n)]
                break
            except:
                continue

키배드의 인덱스 위치를 찾는 함수를 하나 만들어 주었다.

만약, index가 없는 경우 에러를 발생시키기 때문에 try catch문으로 감싸주었다.

다시말해 에러가 났다면 index가 없는 것이고 그 반복 분기는 넘기면 된다.

 

 

def solution(numbers, hand):
    left = findIndex("*")
    right = findIndex("#")
    current = []
    result = []
    answer = ''

    for n in numbers:   
        if n == 1 or n == 4 or n == 7:
            left = findIndex(n)
            result.append("L")
        
        elif n == 3 or n == 6 or n == 9:
            right = findIndex(n)
            result.append("R")
            
        else:
            current = findIndex(n)
            rightCur = abs(right[0] - current[0]) + abs(right[1] - current[1])
            leftCur = abs(left[0] - current[0]) + abs(left[1] - current[1])
            
            if(rightCur == leftCur):
                if hand == "right" :
                    right = current
                    result.append("R")
                elif hand == "left":
                    left = current
                    result.append("L")
            elif(rightCur - leftCur > 0):
                left = current
                result.append("L")
            else:
                right = current
                result.append("R")

    answer = "".join(result)          
    
    return answer

왼손은 *에서 오른손은 #에서 시작해준다.

current는 가운데 번호로 2,5,8,0의 경우를 나타내준다.

각 분기별 결과는 result에 넣어 반복문이 끝나고 문자열 형태로 answer에 저장해 줄 것 이다.

 

1. 왼손 입력

        if n == 1 or n == 4 or n == 7:
            left = findIndex(n)
            result.append("L")

1,4,7은 왼손이다.

left는 더 이상 *이 아니기 때문에 위치를 저장해주고 왼손으로 눌렀다는 의미로 L을 넣어준다.

 

2. 오른손 입력

        elif n == 3 or n == 6 or n == 9:
            right = findIndex(n)
            result.append("R")

3,6,9는 오른손이다

right는 더 이상 #이 아니기 때문에 위치를 저장해주고 오른손으로 눌렀다는 의미로 R을 넣어준다.

 

3. 가운데 번호들

 else:
            current = findIndex(n)
            rightCur = abs(right[0] - current[0]) + abs(right[1] - current[1])
            leftCur = abs(left[0] - current[0]) + abs(left[1] - current[1])
            
            if(rightCur == leftCur):
                if hand == "right" :
                    right = current
                    result.append("R")
                elif hand == "left":
                    left = current
                    result.append("L")
            elif(rightCur - leftCur > 0):
                left = current
                result.append("L")
            else:
                right = current
                result.append("R")

2,5,8,0은 조금 까다롭다.

먼저 current에 가운데 인덱스를 넣어주자.

그 후 current기준으로 right와 left의 거리를 계산한다.

 

다음 문제의 조건에 맞는 분기에 들어가서 원하는 행동을 취하면 된다.

 

  answer = "".join(result)

최종으로 결과를 answer에 문자열로 저장해준다.

 

 

Comments