[프로그래머스] Lv.1 키패드 누르기

Tony Kim·2022년 1월 11일
0
post-thumbnail

[프로그래머스]

Lv.1 키패드 누르기

1. 문제

input으로 입력받은 번호를 휴대폰 키패드에서 어떤 손(왼손, 오른손)으로 누르는 것이 더 효율적인지 묻는 문제. left right를 output으로 return

2. 풀이

먼저 반복문으로 input으로 입력받은 숫자를 키패드 왼쪽/오른쪽/가운데 케이스별로 나누어 처리하고 중간 숫자의 경우 좌표를 이용하여 (dict) index의 번호와 최근에 접근한 R, L의 거리를 비교

이때 거리 계산은 처음에 피타고라스의 정리를 이용했지만 runtime error문제 발생. 문제에서 좌표간의 거리가 아니라 좌표의 이동에 대한 힌트가 있었음. 그래서 x-x' + y-y'값으로 거리를 설정(좌표가 한칸씩 이동한다는 문제의 전제 활용)

3. 코드

def solution(numbers, hand):
    answer = '';
    n = numbers;
    pos = {1:[1,1], 2:[1,2], 3:[1,3], 4:[2,1], 
5:[2,2], 6:[2,3], 7:[3,1], 8:[3,2], 9:[3,3], 
"*":[4,1], 0:[4,2], "#":[4,3]};
    ll = ["*"];
    rr = ["#"];    
    for i in range(len(n)):
        if n[i] in [1,4,7]:
            answer += "L"
            ll.append(n[i])
        elif n[i] in [3,6,9]:
            answer += "R"
            rr.append(n[i])
        else:
            np = pos.get(n[i]);
            lp = pos.get(ll[-1]); 
            rp = pos.get(rr[-1]);
            ld = abs((np[0]-lp[0])) + abs((np[1]-lp[1]));
            rd = abs((np[0]-rp[0])) + abs((np[1]-rp[1]));
            if ld < rd:
                answer += "L"
                ll.append(n[i])
            elif ld > rd:
                answer += "R"
                rr.append(n[i])
            else:
                if hand == "left":
                    answer += "L"
                    ll.append(n[i])
                else:
                    answer += "R"
                    rr.append(n[i])   
    return answer

참고할만한 코드도 비슷하여 모범코드 X

  • 문제를 잘 읽어서 실수하지 않기
  • int str / list 혼용하지 않기
  • int의 경우 +를 사용하여 리스트에 추가할 수 없으므로 append사용
  • dict.get(a) 까먹지 말기
profile
Back-end-dev

0개의 댓글