알고리즘 (JAVA)/프로그래머스 알고리즘

[코테준비 - python] 키패드 누르기 level1 - 개발자 배찌

개발자 배찌 2022. 12. 3. 18:55
728x90

문법 몰랐던 내용

절대값 구하는 방법

abs(i)

 

 

 

내 문제 풀이

def solution(numbers, hand):
    leftSpot = 0 #왼 엄지 위치
    rightSpot = 0 #오른 엄지 위치
    answer = ''
    
    for i in range(len(numbers)) :
        if (numbers[i] == 1 or numbers[i] == 4 or numbers[i] == 7) :
            leftSpot = numbers[i]
            answer += 'L'
        elif (numbers[i] == 3 or numbers[i] == 6 or numbers[i] == 9) :
            rightSpot = numbers[i]
            answer += 'R'
        elif (numbers[i] == 2 or numbers[i] == 5 or numbers[i] == 8 or numbers[i] == 0) :
            if(abs(leftSpot - numbers[i]) < abs(rightSpot - numbers[i])) :
                leftSpot = numbers[i]
                answer += 'L'
            elif(abs(leftSpot - numbers[i]) > abs(rightSpot - numbers[i])) :
                rightSpot = numbers[i]
                answer += 'R'
            else :
                if hand == 'left' : 
                    leftSpot = numbers[i]
                    answer += 'L'
                else :
                    rightSpot = numbers[i]
                    answer += 'R'
    return answer

 

 

무엇이 문제일까.. 했더니

누른 숫자와 왼손오른손에 위치한 숫자의 거리를 잘못 계산하고 있었던 것!

애초에 나는 숫자끼리 뺀 값이 두 숫자의 거리인줄 알았는데, 아닌 경우도 존재했었다.

 

다른사람의 풀이를 보니, 키패드를 이렇게 정의했다.

 

def distance(currentSpotNum, NextNum) :
    keypad = { 1: [0,0], 2: [1,0], 3: [2,0],
               4: [0,1], 5: [1,1], 6: [2,1],
               7: [0,2], 8: [1,2], 9: [2,2],
               "x": [0,3], 0: [1,3], "#":[2,3], }
    x1, y1 = keypad[currentSpotNum]
    x2, y2 = keypad[NextNum]
    
    return abs(x1-x2) + abs(y1-y2)

이해가 잘 안가지만... 이렇게 써주면 거리를 구할수 있다..

 

다른사람의 풀이

def solution(numbers, hand):
    leftSpot = '*' #왼 엄지 위치
    rightSpot = '#' #오른 엄지 위치
    answer = ''
    
    keypad = { 1: [0,0], 2: [1,0], 3: [2,0],
               4: [0,1], 5: [1,1], 6: [2,1],
               7: [0,2], 8: [1,2], 9: [2,2],
               "x": [0,3], 0: [1,3], "#":[2,3], }
    
    for i in numbers:
        if i in [1,4,7] :
            answer += 'L'
            leftSpot = i
        elif i in [3,6,9] :
            answer += 'R'
            rightSpot = i
        elif i in [2,5,8,0] :
            curPos = keypad[i]
            leftPos = keypad[leftSpot]
            rightPos = keypad[rightSpot]
            
            leftDistance = abs(curPos[0]-leftPos[0]) + abs(curPos[1]-leftPos[1])
            rightDistance = abs(curPos[0]-rightPos[0]) + abs(curPos[1]-rightPos[1])
            
            if leftDistance > rightDistance :
                answer += 'R'
                rightSpot = i
            elif leftDistance < rightDistance :
                answer += 'L'
                leftSpot = i
            else :
                if hand == 'left':
                    answer += 'L'
                    leftSpot = i
                else :
                    answer += 'R'
                    rightSpot=i
    return answer

 

아니 왜 런타임오류가 나는거지?

미치겠네... 다른사람은잘된것같은데..모르겠다.......