본문 바로가기

코딩

코딩테스트 연습 [카카오 인턴] 키패드 누르기 파이썬

반응형

입출력 예를 보면서 써야하는 변수를 생각하는데 힌트를 얻었다.

그래서 왼손의 위치, 오른손의 위치, 다음에 누를 것을 변수로, 그리고 각 번호마다 다른 번호들과의 거리를 구해서 딕셔너리를 만들어놨다. 

 

def solution(numbers, hand):
    answer = ''
    hand = hand[0].upper()
    l='*'
    r='#'
    two = {1:1, 3:1, 5:1, 4:2, 6:2, 8:2, 0:3, 7:3, 9:3, '*':4, '#':4}
    five = {2:1, 4:1, 6:1, 8:1, 1:2, 3:2, 7:2, 9:2, 0:2, '*':3, '#':3}
    eight = {5:1, 7:1, 9:1, 0:1, 2:2, 4:2, 6:2, '*':2, '#':2, 1:3, 3:3}
    zero = {'*':1, '#':1, 8:1, 7:2, 9:2, 5:2, 2:3, 4:3, 6:3, 1:4, 3:4}
    for target in numbers:
        if target in [1,4,7]:
            answer+='L'
            l=target
        elif target in [3,6,9]:
            answer+='R'
            r=target
        else:
            if target == 2:
                if two[l] < two[r]:
                    answer+='L'
                    l=target
                elif two[l] > two[r]:
                    answer+='R'
                    r=target
                else:
                    answer+=hand
                    if hand == 'R':
                        r=target
                    else:
                        l=target
            elif target == 5:
                if five[l] < five[r]:
                    answer+='L'
                    l=target
                elif five[l] > five[r]:
                    answer+='R'
                    r=target
                else:
                    answer+=hand
                    if hand == 'R':
                        r=target
                    else:
                        l=target
            elif target == 8:
                if eight[l] < eight[r]:
                    answer+='L'
                    l=target
                elif eight[l] > eight[r]:
                    answer+='R'
                    r=target
                else:
                    answer+=hand
                    if hand == 'R':
                        r=target
                    else:
                        l=target
            else:
                if zero[l] < zero[r]:
                    answer+='L'
                    l=target
                elif zero[l] > zero[r]:
                    answer+='R'
                    r=target
                else:
                    answer+=hand
                    if hand == 'R':
                        r=target
                    else:
                        l=target
    return answer

 

근데 위 코드대로 하니까 7~9, 11~20이 오류가 나는 것...!

 

 

그것도 런타임 에러가 나길래 왜 나는 건지 이해할 수 없었는데 유일하게 딕셔너리에 집어넣지 않은 게 생각났다

바로 자기 자신!!!!!!

자기자신과 자기자신의 거리는 0인데 이렇게 될 상황을 고려하지 못해서 런타임 에러가 났던 것이다

아래 코드로 고쳐서 통과했다.

 

def solution(numbers, hand):
    answer = ''
    hand = hand[0].upper()
    l='*'
    r='#'
    two = {2:0, 1:1, 3:1, 5:1, 4:2, 6:2, 8:2, 0:3, 7:3, 9:3, '*':4, '#':4}
    five = {5:0, 2:1, 4:1, 6:1, 8:1, 1:2, 3:2, 7:2, 9:2, 0:2, '*':3, '#':3}
    eight = {8:0, 5:1, 7:1, 9:1, 0:1, 2:2, 4:2, 6:2, '*':2, '#':2, 1:3, 3:3}
    zero = {0:0, '*':1, '#':1, 8:1, 7:2, 9:2, 5:2, 2:3, 4:3, 6:3, 1:4, 3:4}
    for target in numbers:
        if target in [1,4,7]:
            answer+='L'
            l=target
        elif target in [3,6,9]:
            answer+='R'
            r=target
        else:
            if target == 2:
                if two[l] < two[r]:
                    answer+='L'
                    l=target
                elif two[l] > two[r]:
                    answer+='R'
                    r=target
                else:
                    answer+=hand
                    if hand == 'R':
                        r=target
                    else:
                        l=target
            elif target == 5:
                if five[l] < five[r]:
                    answer+='L'
                    l=target
                elif five[l] > five[r]:
                    answer+='R'
                    r=target
                else:
                    answer+=hand
                    if hand == 'R':
                        r=target
                    else:
                        l=target
            elif target == 8:
                if eight[l] < eight[r]:
                    answer+='L'
                    l=target
                elif eight[l] > eight[r]:
                    answer+='R'
                    r=target
                else:
                    answer+=hand
                    if hand == 'R':
                        r=target
                    else:
                        l=target
            else:
                if zero[l] < zero[r]:
                    answer+='L'
                    l=target
                elif zero[l] > zero[r]:
                    answer+='R'
                    r=target
                else:
                    answer+=hand
                    if hand == 'R':
                        r=target
                    else:
                        l=target
    return answer

 

 

거의 3개월만에 통과한 것 같다

1월에 풀다가 힘들어서 다른 문제 풀면서 실력 쌓고 왔더니 풀렸다

여러분 모두 파이팅

반응형